如何判断一棵二叉树是否是平衡二叉树

作者&投稿:照孟 (若有异议请与网页底部的电邮联系)
平衡二叉树怎么判断的~

平衡树:平衡二叉树

平衡树:平衡二叉树

平衡二叉树是指一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树,即所有结点,其左右子树高度差不超过1。
判读步骤是:
先计算所有结点的高度,高度是从叶节点开始(其高度为1)自底向上逐层累加的,不同叶子节点计算开始计算时,高度不同取最大值。
然后计算结点左右子树的高度差,如果绝对值都不超过1,就是平衡的。
例子:
A
/ \
B C
/ \
D E
高度是 D:1 E:1 B:2 C:1 A:3,A的高度差为1, B为0 C为0 叶子结点可以不用计算,肯定为0。上述例子的二叉树就是平衡的二叉树。
看一下例子
A
/ \
B C
/ \
D E
/
F
高度是 F:1 D:2 E:1 B:3 C:1 A:4,其中A的左右子树高度差B3 - A1 = 2,高度差大于2,所以不平衡。
当然实际判断是不是平衡二叉树,不一定需要计算每一个结点高度,因为左子树高一点或者右子树高一点,表面看过去还是比较明显的,计算一下比较明显的几个点就可以。

判断该树是否为平衡二叉树

方法一:调用上述函数求每个节点的左右孩子深度

[cpp] view plaincopyprint?
bool IsBalanced(BinaryTreeNode* pRoot)
{
if(pRoot== NULL)
return true;

int nLeftDepth = TreeDepth(pRoot->m_pLeft);
int nRightDepth = TreeDepth(pRoot->m_pRight);
int diff = nRightDepth-nLeftDepth;

if (diff>1 || diff<-1)
return false;

return IsBalanced(pRoot->m_pLeft)&&IsBalanced(pRoot->m_pRight);
}

方法二:由于上述方法在求该结点的的左右子树深度时遍历一遍树,再次判断子树的平衡性时又遍历一遍树结构,造成遍历多次。因此方法二是一边遍历树一边判断每个结点是否具有平衡性。

[cpp] view plaincopyprint?
bool IsBalanced(BinaryTreeNode* pRoot, int* depth)
{
if(pRoot== NULL)
{
*depth = 0;
return true;
}

int nLeftDepth,nRightDepth;
bool bLeft= IsBalanced(pRoot->m_pLeft, &nLeftDepth);
bool bRight = IsBalanced(pRoot->m_pRight, &nRightDepth);

if (bLeft && bRight)
{
int diff = nRightDepth-nLeftDepth;
if (diff<=1 || diff>=-1)
{
*depth = 1+(nLeftDepth > nRightDepth ? nLeftDepth : nRightDepth);
return true;
}
}

return false;
}

bool IsBalanced(BinaryTreeNode* pRoot)
{
int depth = 0;

return IsBalanced(pRoot, &depth);
}

平衡树:平衡二叉树




如何判断二叉树是否存在?
先序列号为这个,那么在编辑的时候,可以先进行用顺序的方式,然后再进行。后序序列是CBA。根据前序,可以确定A为根,A在中序中的位置,可以确定CB为A的左子树上的结点,没有右子树。确定A之后,再看中序第二值为B,查看B在中序中的位置,C在B左边,确定C为B的左子树。

怎么判断是不是二叉树?
所谓完全二叉树就是从上到下,从左到右中间都是满的,没有缺口(每个结点有2个孩子,如果其中某个结点没有孩子,再往后都不能有孩子)因此这样看,A是完全二叉树,B也是,D也是,但是C不满足,中间出现了一个结点有右孩子,反而没有左孩子 ...

怎样判断一颗二叉树是否是平衡树?
在节点最少的情况下,左右子树的高度差1,则总节点数S(n)=S(n-1)+S(n-2)+1。初始值 S(1) = 1 S(2) = 2 可以推出 S(3) = 4 S(4) = 7 S(5) = 12 S(6) = 20 S(7) = 33 S(8) = 54 高度为8的平衡二叉树最少结点数是54 如果高度比较大的树,...

如何判断一个二叉树是否为生成树?
首先完全图是每一对顶点之间恰好有一条边,一个有n个顶点的完全图,共有n(n-1)\/2条边。生成树是原图的极小连通子图,包含原图所有n个节点,并且保持图连通的同时,边最少。一个有n个顶点的完全图其生成树有n-1条边。生成树中顶点数和边数分别为n,n-1。这个问题十分简单,上面两位已给出了...

如何判断一棵二叉树的高度是否等于它的节点数?
答案是高度等于其节点数的二叉树;分析如下:先序遍历顺序是:M-L-R,后序遍历顺序是:L-R-M,可以看到,只有中间的结点(M)顺序变化了,左右结点相对位置是不变的;那可以推断出,要满足题意的话“二叉树的先序序列与后序序列正好相反”,说明整个二叉树左子树或者右子树有一个没有(遍历就成了...

如何判断这棵树是否是完全二叉树??
K = 7层,完全二叉树就是满二叉去掉或者不去掉右边底层的一些东西。所以你能确定的就是这棵树高度7并且前6层是满二叉树。 前6层结点个数应该是2的(K)次方-1 即63个结点。 剩余结点个数为 38个结点。也就是说这38个结点处在第七层。当前这叶子结点包含这38个。对于第七层应该具有的结点...

如何判断一棵二叉树是否是平衡二叉树
看一下例子 A \/ \\ B C \/ \\ D E \/ F 高度是 F:1 D:2 E:1 B:3 C:1 A:4,其中A的左右子树高度差B3 - A1 = 2,高度差大于2,所以不平衡。当然实际判断是不是平衡二叉树,不一定需要计算每一个结点高度,因为左子树高一点或者右子树高一点,表面看过去还是比较明显的...

有哪些方法可以判断二叉树是左孩子还是右孩子?
用特殊情况考虑,首先画出特殊情况下的树 考虑从树转换成二叉树过程,举例如图 因此做出树对应的二叉树 可知二叉树中前1895个结点无右孩子,叶结点最后一个节点无右孩子,因此共1895+1=1896个结点

如何判断二叉树是满二叉树
全二叉树(Complete Binary Tree): 若设二叉树的高度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的节点都连续集中在最左边,这就是完全二叉树。 判断很简单,广度优先搜索整个二叉树,一旦找一个不含有子节点或者只含有一个左子节点之后,那么后续的所有节点都必须是叶子节点。否...

怎样判断二叉树的深度是几层
4、二叉树的根节点既有右子树又有左子树,那么可以判断,那么二叉树的深度应该是其左右子树的深度较大值加1。一棵深度为k,且有2^k-1个节点的二叉树,称为满二叉树。这种树的特点是每一层上的节点数都是最大节点数。而在一棵二叉树中,除最后一层外,若其余层都是满的,并且最后一层或者是满...

古冶区15822975300: 如何判断一棵二叉树是否是平衡二叉树 -
芮孙盐酸: 平衡二叉树是指一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树,即所有结点,其左右子树高度差不超过1. 判读步骤是: 先计算所有结点的高度,高度是从叶节点开始(其高度为1)自底向上...

古冶区15822975300: 怎样判断一个二叉排序树是平衡的二叉树? -
芮孙盐酸: 平衡二叉树是一个结点的左子树和右子树的高度差的绝对值不大于1,如果绝对值大于1 ,即为不平衡...

古冶区15822975300: 输入一颗二叉树判断是不是平衡二叉树 -
芮孙盐酸: 可以递归求解左右子树高度之差,只要这个差在0,1,-1就是平衡的二叉树

古冶区15822975300: 平衡二叉树判定 -
芮孙盐酸: 根据定义来判定:平衡二叉树的根结点的左子树和右子树都copy是平衡二叉树,且高度相差不超过1.算法设计:函数 is_AVL(Node V, int& h)返回以结点V为根的子树是否是平衡二叉树,同时计算子树高度存入h中返回.(假设zhidaoV->lchild和...

古冶区15822975300: 平衡二叉树的判定 -
芮孙盐酸: 首先要告诉你,如果只知道一个先序遍历或后序遍历,是没法确定一个二叉树的,有两种方式可以确定一棵二叉树,一是知道先序和中序可以确定二叉树,二是知道后序和中序可以确定二叉树.举个例子给你看就明白了.1.A / B / \ C / \ D / \E2. ...

古冶区15822975300: 判断一棵二叉树是不是平衡二叉树 -
芮孙盐酸: 使用楼主的代码,作为[方案1],进行测试,稍作修改,可能因为修改不当,或者调用函数不当,会导致判断结果有错误.[方案2]是来自其他网友的代码,方法是:遍历整个二叉树,求每个结点的左右孩子深度,如果左右孩子深度的差值大于1,则...

古冶区15822975300: 这棵树是平衡二叉树么? -
芮孙盐酸: 这棵二叉树不是平衡二叉树,这个可以根据平衡二叉树定义来判定,虽然对根来说是平衡的,但对根的左右子树来讲,出现了不平衡,所以是不是平衡二叉树.平衡二叉树要求对树中所有结点都是平衡的.

古冶区15822975300: 如何判断两个结点是否在一棵树上 -
芮孙盐酸: 平衡二叉树是指一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树,即所有结点,其左右子树高度差不超过1. 判读步骤是: 先计算所有结点的高度,高度是从叶节点开始(其高度为1)...

古冶区15822975300: 如何判断一个序列是否可以产生平衡二叉树 -
芮孙盐酸: 判断该树是否为平衡二叉树方法一:调用上述函数求每个节点的左右孩子深度[cpp] view plaincopyprint?bool IsBalanced(BinaryTreeNode* pRoot) { if(pRoot== NULL) return true; int nLeftDepth = TreeDepth(pRoot->m_pLeft); int nRightDepth = ...

古冶区15822975300: 利用递归算法判断二叉链表存储的二叉树是否为平衡二叉树 -
芮孙盐酸: 判断二叉树是否是平衡二叉树,实际上就是判定其所有子树的左右子树的深度之差都为0或1. bool isBlance(BiTree root, int &deep) {int left_deep;int right_deep;if (root == NULL){deep = 0;return true;} if (!isBlance(root->left,left_deep) || !...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网