本文已参与「新人创作礼」活动,一起开启掘金创作之路。
平衡二叉树
根据数列 {1,2,3,4,5,6},创建一个二叉排序树(BSL)
左边(BSL)==存在问题==分析
- 左子树全部为空,从形式上看,更像一个单链表
- 插入速度没有影响
- 查询速度明显降低(因为需要依次比较), 不能发挥BST 的优势,因为每次还需要比较左子树,其查询速度比 单链表还慢
- 平衡二叉树(AVL)
基本介绍
别名:平衡二叉搜索树(Self-balancing binary search tree),AVL树
==保证查询效率较高==
满足二叉排序树
特点
-
AVL是一 棵空树或左右两个子树的==高度差的====绝对值不超过1==,且左右两个子树都是一棵平衡二叉树
-
常用实现方法
- 红黑树
- AVL
- 替罪羊树
- Treap (横二叉树)
- 伸展树
平衡二叉树 - 单旋转(左旋转)
根据数列 {4,3,6,5,7,8},创建出对应的平衡二叉树
结点的左旋转
- 将 A 节点的 右节点 的 左节点 ,指向 A节点
- 将 A 节点的右节点,指向 A 节点的右节点的左节点
左旋转原因
- 右子树高度比左子树高度 高 并且高度差绝对值大于1
左旋转目的
- 降低右子树高度
AVL树高度求解
- 总的高度
- 右子树高度
- 左子树高度
代码分析
-
创建一个新结点newNode,值为当前根节点值
-
将新节点的左子树设置为当前节点的左子树
newNode.left = left
-
将新节点的右子树设置为当前节点的右子树的左子树
newNode.right= right.left
-
将当前节点的值为右子节点的值
value = right.value
-
将当前节点的右子树设置为右子树的右子树
right = right .right
-
将当前节点的左子树设置为新节点
left = newNode