随笔分类 -  二叉树

判断二叉树是不是平衡
摘要:平衡二叉树(Balanced Binary Tree)又被称为AVL树(有别于AVL算法),且具有以下性质:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。题目:输入一棵二叉树的根结点,判断该树是不是平衡二叉树。如果某二叉树中任意结点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。例如下图中的二叉树就是一棵平衡二叉树:在本系列博客的第27题,我们曾介绍过如何求二叉树的深度。有了求二叉树的深度的经验之后再解决这个问题,我们很容易就能想到一个思路:在遍历树的每个结点的时候,调用函数TreeDepth得到它的左右子树的深度。如果每个结点的左右子树 阅读全文
posted @ 2013-11-11 13:33 猿人谷 阅读(1932) 评论(0) 推荐(0) 编辑
二叉树的深度
摘要:题目:输入一棵二叉树的根结点,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。例如:输入二叉树: 10 / \ 6 14 / / \ 4 12 16输出该树的深度3。二叉树的结点定义如下:struct SBinaryTreeNode // a node of the binary tree{ int m_nValue; // value of node SBinaryTreeNode *m_pLeft; // left child of node SBinaryTreeNo... 阅读全文
posted @ 2013-11-11 13:18 猿人谷 阅读(518) 评论(0) 推荐(0) 编辑
二叉搜索树的后序遍历序列
摘要:题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。如果是返回true,否则返回false。例如输入5、7、6、9、11、10、8,由于这一整数序列是如下树的后序遍历结果: 8 / \ 6 10 / \/ \ 5 7911因此返回true。如果输入7、4、6、5,没有哪棵树的后序遍历的结果是这个序列,因此返回false。分析:这是一道trilogy的笔试题,主要考查对二元查找树的理解。在后续遍历得到的序列中,最后一个元素为树的根结点。从头开始扫描这个序列,比根结点小的元素都应该位于序列的左半部分;从第一个大于根结点开始到根结点前面的一个元素为止,所有元素都应该大于根结点,因为 阅读全文
posted @ 2013-11-11 10:36 猿人谷 阅读(599) 评论(0) 推荐(0) 编辑
求二元查找树的镜像
摘要:题目:输入一颗二元查找树,将该树转换为它的镜像,即在转换后的二元查找树中,左子树的结点都大于右子树的结点。用递归和循环两种方法完成树的镜像转换。例如输入: 8 / \ 6 10/\ /\5 7 9 11输出: 8 / \ 10 6/\ /\119 7 5定义二元查找树的结点为:struct BSTreeNode // a node in the binary search tree (BST){ int m_nValue; // value of node BSTreeNode *m_pLeft; // left child of node ... 阅读全文
posted @ 2013-11-04 16:56 猿人谷 阅读(495) 评论(0) 推荐(0) 编辑
树的子结构
摘要:题目:输入两棵二叉树A和B,判断B是不是A的子结构。二叉树结点的定义如下:struct BinaryTreeNode{ int m_nValue; BinaryTreeNode *m_pLeft; BinaryTreeNode *m_pRight;};例如图中的两棵二叉树,由于A中有一部分子树的结构和B是一样的,因此B是A的子结构。要查找树A中是否存在和树B结构一样的子树,可以分成两步:第一步在树A中找到和B的根节点的值一样的结点R;第二步再判断树A中以R为根结点的子树是不是包含和树B一样的结构。第一步在树A中查找与根结点的值一样的结点,这实际上就是树... 阅读全文
posted @ 2013-11-03 21:36 猿人谷 阅读(6990) 评论(1) 推荐(3) 编辑
从上到下打印二叉树——层序遍历二叉树
摘要:题目:从上往下打印出二叉树的每个结点,同一层的结点按照从左到右的顺序打印。例如输入 8 / \ 6 10 /\ /\5 7 9 11输出8 6 10 5 7 9 11。二叉树结点的定义如下:struct BinaryTreeNode{ int m_nValue; BinaryTreeNode *m_pLeft; BinaryTreeNode *m_pRight;};从上到下打印二叉树的规律:每一次打印一个结点的时候,如果该结点有子结点,则把该结点的子结点放到一个队列的末尾。接下来到队列的头部取出最早进入队列的结点,重复前面的打印操作,直至队列中所有的结... 阅读全文
posted @ 2013-11-03 19:10 猿人谷 阅读(10337) 评论(0) 推荐(0) 编辑
二元树中和为某一值的所有路径
摘要:题目:输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。例如输入整数22和如下二元树 10 / \ 5 12 / \ 4 7 则打印出两条路径:10, 12和10, 5, 7。二元树结点的数据结构定义为:struct BinaryTreeNode // a node in the binary tree{ int m_nValue; // value of node BinaryTreeNode *m_pLeft; // left child of node ... 阅读全文
posted @ 2013-10-31 20:18 猿人谷 阅读(397) 评论(0) 推荐(0) 编辑
二叉树的遍历——递归和非递归
摘要:二 叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的。对于二叉树,有前序、中序以及后序三种遍历方法。因为树的定义本身就是 递归定义,因此采用递归的方法去实现树的三种遍历不仅容易理解而且代码很简洁。而对于树的遍历若采用非递归的方法,就要采用栈去模拟实现。在三种遍历中, 前序和中序遍历的非递归算法都很容易实现,非递归后序遍历实现起来相对来说要难一点。一.前序遍历 前序遍历按照“根结点-左孩子-右孩子”的顺序进行访问。 1.递归实现[cpp] view plaincopyvoidpre_order(BTree*root){if(root!=NULL)//必不可少的条件.. 阅读全文
posted @ 2013-10-31 15:45 猿人谷 阅读(10436) 评论(2) 推荐(4) 编辑