什么叫平衡二叉树,平衡二叉树与完全二叉树区别
如何判断一棵二叉树是否是平衡二叉树
平衡二叉树是指一 棵空树或它的左右两个子树的高度差的绝对值不超过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,所以不平衡。
当然实际判断是不是平衡二叉树,不一定需要计算每一个结点高度,因为左子树高一点或者右子树高一点,表面看过去还是比较明显的,计算一下比较明显的几个点就可以。
这是平衡二叉树吗?
是的
平衡二叉树,又称AVL树,指的是左子树上的所有节点的值都比根节点的值小,而右子树上的所有节点的值都比根节点的值大,且左子树与右子树的高度差最大为1。因此,平衡二叉树满足所有二叉排序(搜索)树的性质。
平衡二叉树是二叉排序树吗?
是的。
衡二叉树(balanced binary tree)是一种特殊的二叉排序树,它或者为空树,或者每个结点的左右子树都是平衡二叉树,也就是每个结点的左右子树的高度之差只能是-1,0,1三种情况。
平衡二叉树又称AVL树,是由苏联的Georgy Adelson-Velsky和E.M.Landis发明的,并以他们的名字命名。
平衡二叉树的平衡状况由平衡因子(Balance Factor,BF)来衡量。平衡因子定义为当前结点的左子树高度减去右子树的高度之差,其可能取值只有-1,0,1。叶结点的BF都是0。
平衡二叉树的应用价值:
如果能维持平衡二叉树的结构,检索操作就能在O(log n)时间内完成,实现高效检索。
最小不平衡子树:
距离插入结点最近的,且平衡因子的绝对值大于1的结点为根的子树。(指BF超出合法值)。
最小非平衡子树:
包含插入结点位置,其根结点的BF是1或-1的最小子树。(指BF非0,但BF在合法值范围内)。
以上内容参考:百度百科-平衡二叉查找树
平衡二叉树是什么?
平衡二叉树(AVL)
那对图 1 进行下改造,把数据重新节点重新连接下,图 2 如下:
图 2 可以看到以下特性:
1. 所有左子树的节点都小于其对应的父节点(4,5,6)(7);(4)(5);(8) (9);
2. 所有右子树上的节点都大于其对应的父节点(8,9,10)(7);(6)(5);(10)(9);
3. 每个节点的平衡因子差值绝对值 =1;
4. 每个节点都符合以上三个特征。
满足这样条件的树叫平衡二叉树(AVL)树。
问:那再次查找节点 5,需要遍历多少次呢?
由于数据是按照顺序组织的,那查找起来非常快,从上往下找:7-5,只需要在左子树上查找,也就是遍历 2 次就找到了 5。假设要找到叶子节点 10,只需要在右子树上查找,那也最多需要 3 次,7-9-10。也就说 AVL 树在查找方面性能很好,最坏的情况是找到一个节点需要消耗的次数也就是树的层数, 复杂度为 O(logN)
如果节点非常多呢?假设现在有 31 个节点,用 AVL 树表示如图 3:
图 3 是一棵高度为 4 的 AVL 树,有 5 层共 31 个节点,橙色是 ROOT 节点,蓝色是叶子节点。对 AVL 树的查找来看起来已经很完美了,能不能再优化下?比如,能否把这个节点里存放的 KEY 增加?能否减少树的总层数?那减少纵深只能从横向来想办法,这时候可以考虑用多叉树。
请简单描述什么是二叉树以及平衡二叉树
简单的说:二叉树就是每一个结点的叶子结点小于两个的树,如
o
/ \
Y Y
平衡二叉树就是每个结点的左右子树高度差不超过2,如:上面的二叉树便是,下面的树就不是平衡二叉树
o
/
o
/
o
其左子树高度是2,右子树是0,高度差为2,不为平衡二叉树。
平衡二叉树
平衡二叉树的定义:
它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树,同时,平衡二叉树必定是二叉搜索树,反之则不一定.
问题1:
把一个升序的数组转换成平衡二叉树
对一个二叉搜索树进行中序遍历就可以得到一个升序的数组,那么反过来考虑,数组的中值即为root,然后数组分为左子树和右子树,继续进行递归即可得出结果.
问题2:
给一个二叉树,判断是否是平衡树
首先写计算二叉树高度的函数
树的高度 = max(左子树高度,右子树高度)+1
可以得到高度后对树递归求解每个节点的左右子树的高度差,如果有大于1的,则return False