day40
7 二叉搜索树
7a. 概述
BST: 二叉搜索树 ; BBST:平衡二叉搜索树
7b
7b-1 BST查找
_hot记忆节点的语义:总是指向命中节点的父亲
7b-2 BST插入
上面插入算法的复杂度不会超过O(h),h为树的高度
7b-3 BST删除
上图为removeAt的可能情况之一:要删除的节点(69)有一颗子树为空,对应代码实现如下:
上述①处代码也能够处理删除节点的左右孩子都不存在的情况
寻找要删除节点(36)的直接后继(40)(直接后继:二叉树中不小于当前节点的最小的值),然后交换二者,因为(40)是(36)的直接后继,所以可以保证原本节点(40)所处的位置是没有左子树的,这样就转换成了第一种情况。具体实现如下:
7c 平衡与等价
前面的查找,插入,删除的复杂度都不会超过O(h),但是如果这棵树退化成了List,复杂度也会变成O(n),n为元素个数
第一种生成方法:随机生成关键码序列,总共有n!种序列。由此得到的n!棵BST,平均树高为 logn
第二种生成方法:随机组成,将每个节点看成积木,考察能够拼出多少种结构互异的BST,计算算出能够得到Catalan(n)棵互异的BST,平均树高为O(√n)
综合考虑,第二种方法更为可信,因为第一种方法不同的关键码可能会对应相同的BST结构,如上图最右边的一棵树。我们也可以看出,中位数或者接近中位数的的节点被越早的插入,树的高度会相应的更低。
大圈代表BST.一棵BBST一系列动态操作,可能不再是BBST,应该采用什么方法,将其再次变为BBST?(等价变换)
如上图,树的拓扑结构不同,而树的中序遍历相同的两颗BST,称为等价的BST
局部性:每次操作在树的局部,保证操作只需要常量时间O(1)
进行一次转换,累计需要操作的次数不要超过O(logn)
day42
7d-1 AVL树重平衡
CBT:完全二叉树;①重平衡的标准;②重平衡的技巧
某个节点平衡因子 = 左子树高度 - 右子树高度 ;注意空树的高度为-1.
S(h):高度为h的树的规模
插入操作可能导致多个祖先失衡,但其后续重平衡操作很简单,而删除操作虽然只会导致一个祖先失衡,但其后续的重平衡操作更复杂。
7d-2 AVL树插入删除重构
zig、zag到底怎么操作
参考教材7-17题
_hot为当前当前节点父节点
AVL树拓扑结构变化量太高,后续要学习的红黑树,,无论是删除还是插入操作,都可以将变化量控制在O(1)
connect34 构思
这样设计可以更加鲁棒的适应各种情况的重构(单旋、双旋)
完成代码,开始第八章
来源:oschina
链接:https://my.oschina.net/u/4412439/blog/4674099