1. 预备知识
(1)实现
孩子兄弟表示法
(2)遍历及其应用
a.先序遍历
这里写图片描述
b.后序遍历
这里写图片描述
2.二叉树
(1)表达式树
a. 先序遍历–前缀表达式–不常用
b. 中序遍历–中缀表达式–直观
c. 后序遍历–后缀表达式–求值无须考虑优先规则
(2)构造树
a.递归建立
先序建立
中序建立
后序建立
b.非递归建立
利用栈或者队列结构暂存节点指针建立。
3.查找树BST
这里写图片描述
缺点–容易左右不平衡,性能严重依赖输入,输入则是随机的,最坏情况下查找树会成为昂贵的链表,运行时间会显著增加。
解决办法:AVL树
4.AVL树
特点:自平衡,查找时间logN
核心操作:旋转
a. 左左
这里写图片描述
b.左右
这里写图片描述
c.右左
这里写图片描述
d. 右右
这里写图片描述
5.伸展树
(1)保证从空树开始的任意连续M次对树的操作最多花费O(MlogN)时间。即一棵伸展树每次操作的摊还代价是O(logN)
注意:当M次操作的序列总的最坏情形运行时间为O(MF(N))时,我们就说它的摊还运行时间是O(F(N)).
(2)思想:当一个节点被访问过后,它就要经过一系列AVL树的旋转被放到根上。这样做有实际效用,因为在许多应用中当一个节点被访问时他就很可能不久再被访问到。
(3)实现:
a. 执行单旋转,从下向上进行,即在访问的路径上的每一个节点都和它们的父节点实施旋转。
缺陷:这个方法使得对K1的访问花费时间减少,但没有明显改变访问路径上其他节点的状况,且对于一系列M个操作共需要以M*N为下界的时间,故不好。
b.展开
如果X父节点是树根,只要旋转X和树根,否则X就有父亲和祖父,存在两种情况。
这里写图片描述
如果是一个之字形,就执行一次标准的AVL双旋转;如果是一个一字形,就执行一个一字型旋转 。 举例:
这里写图片描述
这里写图片描述
总结:看似麻烦,实际编程比AVL简单的多,因为要考虑的情形少并且没有平衡信息需要存储。实践上可以转化成更快的程序代码,运行得更好。
体验:1,2,……32建树,依次从1,2……9展开访问,可以发现需要移动的次数(运行时间)减少,树结构变化规模变大,但规律一致。
6.树的遍历
这里写图片描述
后序遍历的应用
层序遍历–非递归,使用队列
其他遍历–递归,使用栈
7. B-树
(1)阶为M的B-树特点
a.树根,或者一片树叶,或者其儿子数在2-M之间。
b. 除数根外,所有非树叶节点的儿子数在ceil(M/2)和M之间。
c. 所有树叶都在相同的深度上。
(2)所有数据都存在树叶上,任何一个内部节点上都含有指向该节点儿子的指针P1…..Pm,和代表在子树P2,…Pm中发现的最小关键字K1,..Km-1.有些指针是NULL,对应的k则是未定义的。对于每一个节点,其子树P1中的关键字都小于P2中的关键字。
这里写图片描述
4阶B-树更流行的称呼是2-3-4树,3阶的B-树叫做2-3树。
这里写图片描述
插入算法:对于一个M阶的B树,当插入一个关键字时,唯一的困难发生在接收该关键字的节点已经具有M个关键字,这个关键字使得该节点具有M+1个关键字,我们可以把它分裂成两个节点,它们分别具有ceil((M+1)/2)和floor((M+1)/2)个关键字,由于这使得父节点多出一个儿子,我们必须检查这个节点是否可以被父节点接收,如果父节点已经具有M个儿子,那么这个父亲就要被分裂成两个节点。我们一直重复这个过程直到找到一个父节点具有少于M个儿子,如果我们分裂根节点,那么我们就要创建一个新的根,这个根有两个儿子。
删除算法:查找被删除的关键字并将其去除。如果这个关键字时一个节点仅有的两个关键字之一,那么除去它之后就只剩下一个关键字,此时我们可以通过把这个节点与它的一个兄弟合并来进行调整。如果这个兄弟有3个关键字,就取出一个使得两个节点各有两个关键字,如果有2个关键字,就合并,现在这个节点的父亲则失去一个儿子,因此我们必须向上检查到顶部。如果根节点失去了它的第二个儿子,那么这个根也要被删除,树也减少了一层。当我们合并节点的时候,必须记住更新保存在内部节点上的信息。
经验:从运行时间考虑,M最好是3或者4,再增大的话插入和删除的时间就会增加,如果只考虑主存的速度,更高阶的就没有什么优势。
应用:配合磁盘,用于数据库系统的设计。当一颗B树占满ln2=69%时,如果得到第M+1项时,例程不是总去分裂节点,而是搜索能够接纳新儿子的兄弟,此时就可以更好的利用空间。
总结
应用:操作系统,编译器设计,查找
模型:表达式树(扩充可为分析树,不是二叉树),查找树,自平衡树AVL树,伸展树,B-树(平衡M-路树,常见2-3树)。
说明:所有平衡树运行时间都不如查找树省时,但可以防止最坏情形的输入。查找树中序遍历可用来进行排序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值