二叉搜索树概述
二叉搜索树的词条(结点)由Key和Value构成,且Key可以比较大小,且满足
顺序性:任一结点均不小于其左孩子,不大于其右孩子(此处包括了左右孩子的所有子结点)
单调性:BST的中序遍历必然单调非降,树根结点的左侧子结点必然在遍历中根结点的左侧,右子结点在根结点右侧,所有结点的投影即为BST的中序遍历
二叉搜索树BST
BST:查找
因为BST是有序的,所以查找结点e即与根结点v比较,如果e小于v则进入左子树,再与左子树根结点比较,如果大于v则进入右子树
复杂度:
最好情况:O(1)
最坏情况:O(n) 当树退化为单链树,即一条有序向量,则转变为顺序查找
BST:删除
分为待删除结点有单分支和双分支两种情况
单分支:直接删除结点,并用其左孩子代替该点
双分支:找到该结点的后继(即比该节点大一项的结点),交换后继和待删除结点,再转化为单分支情况
BST:平衡与等价
树高渐进不超过O(logn)的称为平衡二叉树BBST
平衡二叉树等价变换:上下可变,局部不变,保持其中序遍历顺序不变,旋转变换为常见的变换,旋转变换有zig(针对左孩子)和zag(针对右孩子)
AVL树 重平衡
AVL=BBST(平衡二叉搜索树),当AVL树发生删除或插入操作时,会引起AVL树不平衡,使其重新变为BBST的过程称为重平衡
平衡因子 = 左子树高度 - 右子树高度
AVL树的定义:任一结点的平衡因子绝对值不超过1
高度为h的AVL树至少包含fib(h+3)-1个结点,包含n个结点的AVL树的高度应该为O(logn)
AVL树 3+4重构
针对三个结点和四个子树,直接按照其中序遍历的顺序来拼接成变换后的AVL树
template <typename T> BinNodePosi(T) BST<T>::connect34(BinNodePosi(T) a,BinNodePosi(T) b,BinNodePosi(T) c,BinNodePosi(T) T0,BinNodePosi(T) T1,BinNodePosi(T) T2,BinNodePosi(T) T3)
{
a->lc=T0;if(T0)T0->parent=a;
a->rc=T1;if(T1)T1->parent=a;updateHeight(a);
c->lc=T2;if(T2)T2->parent=c;
c->rc=T3;if(T3)T3->parent=c;updateHeight(c);
b->lc=a;a->parent=b;
a->rc=c;c->parent=b;
return b;
}
使用一下算法视不同情况调用connect34
AVL树的时间复杂度:
优点 :插入、查找和删除,最坏情况下复杂度均为O(logn),需要O(n)的存储空间
缺点:
1.引入了平衡因子,需要改造数据元素结构,或需要额外封装
2.实测性能与理论性能存在差距
3.单次动态调整之后,全数拓扑结构的变化量可能高达
Ω
(
l
o
g
n
)
\Omega(logn)
Ω(logn)