第4章 树

第4章终于搞定了,太多的练习题了。


知识点

4.1 预备知识

节点的深度为从根到该节点的唯一路径长度,节点的高度为该节点到一片树叶的最长的路径的长。

树实现的一种方法是儿子/兄弟链方法,利于节省空间

4.2 二叉树

一棵二叉树的平均深度为根号N,一棵二叉查找树的平均深度为logN

4.3 查找树ADT--二叉查找树

查找树进行递归操作时,栈空间使用一般为logN

4.4 AVL树

当完成旋转时,树一部分会发生高度变化,树的其余部分必须被告知该变化,这在旋转例程中可以看出。

单旋转和双旋转的结果均降低了变化部分的高度

AVL树的递归添加例程和递归删除例程均将平衡方法放在后面,进行后序遍历。后序遍历有利于平衡从树叶开始进行,因为父节点的平衡和高度依赖于子节点的平衡和高度。

平衡方法中的高度比较时,例如左单旋转,对于添加情况,其左孙子高度肯定大于右孙子高度,但判断时最好写成大于等于,因为对于删除例程来说,可能会造成两个孙子高度一致,虽然采用双旋转同样能达到目的,但是单旋转更加节省时间。

4.5 伸展树

伸展树最大的特点在于其改变了整个树的深度,每进行一次访问,则对折一次高度,不仅仅在于将最近访问的节点提前。

伸展树对于z字形采用双旋转,其直接将高度由2变1,对于非z字形,采用从祖父节点至孙子节点的两个单旋转,而非孙子节点至祖父节点的两个单旋转。其区别在于,虽然两者首次旋转均不会改变高度,但对于后续操作,前者实现分流降低一半高度,而后者则无此作用

4.6 再探树的遍历

遍历有:先序遍历、中序遍历、后序遍历、层序遍历

层序遍历利用队列

4.7 B树

阶为M的B树特性如下

1.数据项存储在树叶上

2.非叶节点存储直到M-1个关键字以指示搜索方向,当然还包括小字节的索引分支

3.树的根或者是一片树叶,或者其儿子树在2和M之间

4.除根外,所有非树叶节点的儿子数在M/2上限和M之间

5.所有的树叶都在相同的深度上并有L/2上限和L之间的数据项

其中L可以和M不同

4.8 标准库中的集合与映射

Map接口没有继承Collection接口,所以Map不提供迭代器,其提供keySet、values、entrySet三种方法来获取有迭代器的集对象

TreeSet和TreeMap底层实现均为红黑树,隐藏有排序特性。

使用多个映射的实例,例如对只有一个字符不同的单词分组打印

第一种方法,对所有单词进行遍历比较,最慢

第二种方法,根据单词长度分组进行遍历比较,较慢

第三种方法,再根据去除某个位置字符后,剩余相同字符串分组,最快。

将复杂的数据分组处理,降低了笛卡尔积大小,提高算法效率,分组时分析共同特性,尽量多层分组。


对知识点的理解

1.递归能转成简单while循环的条件:

先序遍历或后序遍历,中序遍历无法while循环。先序遍历则while开始位置如递归,后序遍历则while开始位置与递归相反

最好递归只嵌套一层递归,若嵌套多层则需有多层while循环,并且要用到break标志,导致程序复杂

2.递归时子节点无法获得的数据项要作为递归方法的参数,传递供其使用,例如含有前后链的节点的递归添加方法

3.旋转与其说是旋转,不如说是调换节点高低更加合适形象。

4.采用二叉查找树排序只花费NlogN时间

5.查找二叉查找树种的第k大,可以对每个节点所带领的树设置节点数目大小,通过递归操作来获取第k大的元素

6.对于含有级别结构的问题,可以试着从树数据结构入手分析


难点和疑点

1.对于随机二叉查找树的深度平均为O(logN)的证明

2.中序线索树的删除例程

3.一次将关键字依次插入空Avl树中,证明所得的树是理想平衡的。关键字:1,2,3...2的h次方-1。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值