1.1 定义
一棵空树,或者是具有下列性质的二叉树:
(1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;
(2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;
(3)左、右子树也分别为二叉排序树;
(4)没有键值相等的结点。
二叉查找树(Binary Search Tree),又叫:二叉搜索树,二叉排序树。
1.2 查找
步骤:
若根结点的值等于查找的值,成功;
若小于根结点的值,递归查左子树;
若大于根结点的值,递归查右子树;
若子树为空,查找不成功。
1.3 插入
首先执行查找算法,找出被插结点的父亲结点(比较被插入值与结点的值)。
判断被插结点是其父亲结点的左、右儿子。
将被插结点作为叶子结点插入。
若二叉树为空,则首先单独生成根结点。
2 AVL树(平衡二叉树)
2.1 简介
AVL树是最先发明的自平衡二叉查找树,在AVL树中任何节点的两个子树的高度差的绝对值不超过1,所以它也被称为高度平衡树。
平衡二叉树(Balanced Binary Tree)又被称为AVL树(有别于AVL算法),且具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。
这个方案很好的解决了二叉查找树退化成链表的问题,把插入,查找,删除的时间复杂度最好情况和最坏情况都维持在O(logN)。但是频繁旋转会使插入和删除牺牲掉O(logN)左右的时间,不过相对二叉查找树来说,时间上稳定了很多。
2.2 定义
AVL树本质上还是一棵二叉查找树,它的特点是:
- 本身首先是一棵二叉查找树。
- 带有平衡条件:每个结点的左右子树的高度之差的绝对值(平衡因子)最多为1。
也就是说,AVL树,本质上是带了平衡功能的二叉查找树(二叉排序树,二叉搜索树)。
2.3 旋转
旋转的目的:是为了实现在插入新的结点之后,实现二叉树的再平衡。
平衡二叉树有4种旋转方式:
- 单旋转-左旋
- 单旋转-右旋
- 双旋转-左右(先左旋后右旋)
- 双旋转-右左(先右旋后左旋)
右旋转
修改parent和curLR的孩子指针域
root = parent -> parent
1 修改parent的指针域
parent -> left = curLR
//避免出现左单支的场景
curLR -> parent = parent
2 修改curL的指针域
curL -> right = parent
curL -> parent = root
双旋转-左右