1.二分搜索树
本身是一个二叉树,但对于每个结点而言,左子树比根节点小,右子树比根节点大,且不包含重复元素。
1-1添加元素
用下图元素举例
定义一个cur游标,先判断树是否为空,若为空则直接进入,如图1,然后3进入,比较3和4的大小,4比3大且4的左孩子为空则,3为4的左孩子。5和4比较,5比4大且4的右孩子为空,则5为4的右孩子。
然后1与4比较,1小于4,则应该在左孩子上,但因为左孩子不为空(当前左孩子为3),则1与3再次比较,1小于3,且3的左孩子为空,1就为3的左孩子。2与4比较,2小于4,应为4的左孩子,因为,4左孩子不为空,则2与3再比较,2比3小,则应为3的左孩子,又因为3的左孩子不为空(此时3的左孩子为1),则2和1再比较,2比1大,且1的右孩子为空,即2为1的右孩子。同理,6比4大,且比5大,且5右孩子为空,即6为5的右孩子。
1-4删除最小值
先找到最小值,然后进行如图操作,让2取代1,作为3的左孩子。
1-5删除最大值
先找到最大值,操作如图。
若最大值还有左孩子的话则如图
将6的左孩子成为5的右孩子,也就是最大值的左孩子替换最大值位置。
1-6删除任意值
例图,我们假设想删除结点3,那么进行图1操作,结果如图2
再举例如图
对28进行删除,那么进行操作如图1 ,删除后如图2所示(这里是用26作为28的替换)
2.avl平衡树
对于任意一个节点,左子树和右子树的高度差不能超过1。满二叉树一定是平衡树且高度最低,完全二叉树也是平衡树。
avl平衡树是什么样子?
就拿上述的图来看
根节点20,它的左子树的深度为4,而右子树的深度为3,俩个高度差为1,符合条件。在以16结点为例,左子树深度为3,右子树为空(即深度为0),那么这个树就不是avl平衡树。
而这个树,每个结点的左右子树的高度差不会超过1,则上图这个数为avl平衡树。
平衡树的调整
我们看图,就是断开x与y和t3,将t3与y连接然后将以y为根节点的树为x的右子树。
rr旋转和ll旋转刚好相反。断开x与y和t3,t3成为y的右子树。然后以y为结点的树作为x的左子树。