二叉树性质:
1.N=n0+n1+n2//从定义数
(从构造算术表达式来理解)叶子结点是参数,根节点是运算符特殊情况下
2.N=n1+2n2+1//从出度(线段)来数,或者说数孩子(规约来看)
1、2得--->n2+1=n0
计算二叉树位置一定要以1开始,层数默认1开始(不是记得最后结果矫正)h代表层数
A0=1 第一层最多只有一个根结点恒成立
二叉树最多多少结点---->a0(1-q^h)/(1-q)--->=2^h-1
二叉树的分类
1.一般树
2.只有左(右)孩子的树:(可改造的单链表)
3.哈夫曼树-应用:哈夫曼编码-权值和最小
按符合严格n叉树的结点数构造哈夫曼树,选取最小的n个值作为叶子结点并以此开始构造。
最佳归并树(磁盘读取次数问题)=哈夫曼树
WPL:树的所有叶结点的带权路径长度之和,称为树的带权路径长度表示为WPL。
磁盘读取总次数=WPL*2
构造哈夫曼树有补0操作:补的个数为%(k-1)
应用:哈夫曼编码(可变长编码),与频数有关的哈夫曼树。
4.平衡二叉树
4.1完全二叉树
4.1.1堆
小根堆:根<左,右
败者树:顺序表存储,不仅是小根堆而且是严格二叉树。(当然也有胜者树,略)
败者树重构过程如下:
将新进入选择树的结点与其父结点进行比赛:将败者存放在父结点中;而胜者再与上一级的父结点比较。
比赛沿着到根结点的路径不断进行,直到ls[1]处。把败者存放在结点ls[1]中,胜者存放在ls[0]中。
K路平衡归并中:败者树也是严格二叉树,选最小的,败者树深度log(2,k)。
选择排序的一种变体。
大根堆:根>左,右
4.1.2满二叉树
删除堆某结点操作相对比较特别。
5.二叉排序树(搜索,查找树)
有第一个结点决定树如何形状,左<根<右
二叉排序树(搜索树)结合了有序数组和链表的优点,在查找数据时的速度和使用了二分法的有序数组一样快,而且在增、删节点的速度也和链表一样。
挖个坑
红黑树 ---二叉搜索树
红黑树与AVL树的比较:
1.AVL树的时间复杂度虽然优于红黑树,但对现在的计算机,cpu太快,可以忽略性能差异
2.红黑树的插入删除比AVL树更便于控制操作
3.红黑树整体性能略优于AVL树(红黑树旋转情况少于AVL树)
红黑树的性质:
红黑树是一棵二叉搜索树,它在每个节点增加了一个存储位记录节点的颜色,可以是RED,也可以是BLACK;通过任意一条从根到叶子简单路径上颜色的约束,红黑树保证最长路径不超过最短路径的二倍,因而近似平衡。
具体性质如下:
1.每个节点颜色不是黑色,就是红色,但根节点是黑色的
2.如果一个节点是红色,那么它的两个子节点就是黑色的(没有连续的红节点)
3.对于每个节点,从该节点到其后代叶节点的简单路径上,均包含相同数目的黑色节点。
特征:祖宗根必黑,允许黑连黑,不允许红连红;
操作:新增红色:1.爸叔都红就变色;2.爸红叔黑就旋转,哪黑(叔)往哪旋。
6.线索二叉树(充分利用空指针的结果)
为了方便找先根、中根、后根遍历的直接前驱和直接后继,解决二叉树不能回溯的问题。
左指针一直找前驱直到空,即是开始,然后一直沿着右指针遍历。
7.严格二叉树
不存在度为1的结点,构造二叉树时,哈夫曼树是严格二叉树,但严格二叉树不一定是哈夫曼树。
严格n叉树,不存在度为1,...,n-1的结点。
二叉树到森林原则:左孩子,右兄弟
树的分类
1.n叉树
包含二叉树的类别
2.查找树
2.1B-树(B树)
m阶B树:除根2子树,至少⌈ m/ 2 ⌉ − 1,至多有m-1个关键字
根结点至多有m棵子树,即至多有m-1个关键字
若根结点不是终端结点,则至少有2棵子树
除根以外的所有非叶结点至少有⌈ m/ 2 ⌉ 棵子树,即结点内至少含有⌈ m/ 2 ⌉ − 1 个关键字
特征:真值在所有节点中
分叉点左<该结点内最左值,该结点内最右值<分叉点右
叶子结点无指针链接
2.2.B+树
特征:叶子结点中已经有了所有值
分叉点左<该结点内最左值,该结点内最右值=分叉点右
叶子结点有指针链接
3.K路归并与K路平衡归并树
4.哈夫曼树(最佳归并树)
略(上面找)
5.并查集(类似双亲表示法的树组成的森林)
根结点唯一标识一个集合
存储:数组、链表、哈希表(散列表)均可
哈希表:按关键字索引
应用:OS的显式链接分配FAT(数组存储类并查集,区别记录后继,且成环)