第6章 树和二叉树
序言
为什么需要树结构?
1.数组存储方式的分析
优点:通过下标方式访问元素,速度快。对于有序数组,还可使用二分查找提高检索速度。
缺点:如果要检索具体某个值,或者插入值(按一定顺序)会整体移动,效率较低。
2.链式存储方式的分析
优点:在一定程度上对数组存储方式有优化(比如:插入一个数值节点,只需要将插入节点,链接到链表中即可, 删除效率也很好)。
缺点:在进行检索时,效率仍然较低,比如(检索某个值,需要从头节点开始遍历) 。
3.树存储方式的分析
能提高数据存储,读取的效率, 比如利用二叉排序树(Binary Sort Tree),既可以保证数据的检索速度,同时也可以保证数据的插入,删除,修改的速度。
树的概述
树的存储
树的顺序存储
顺序存储二叉树应用实例
八大排序算法中的堆排序,就会使用到顺序存储二叉树, 关于堆排序,我们放在<<树结构实际应用>> 章节讲解
先序遍历、中序遍历、后序遍历
线索二叉树
树的链式存储
先序遍历、中序遍历、后序遍历
二叉树
二叉查找树是一种查找效率非常高的数据结构,它有三个特点。
- 每个节点最多只有两个子树。
- 左子树都为小于父节点的值,右子树都为大于父节点的值。(左<父<右)
- 在n个节点中找到目标值,一般只需要log(n)次比较。
二叉查找树的结构不适合数据库,因为它的查找效率与层数相关。越处在下层的数据,就需要越多次比较。极端情况下,n个数据需要n次比较才能找到目标值。
对于数据库来说,每进入一层,就要从硬盘读取一次数据,这非常致命,因为硬盘的读取时间远远大于数据处理时间,数据库读取硬盘的次数越少越好。
树的遍历
1.广度优先遍历
英文缩写为BFS即Breadth FirstSearch。其过程检验来说是对每一层节点依次访问,访问完一层进入下一层,而且每个节点只能访问一次。
对于上面的例子来说,广度优先遍历的 结果是:A,B,C,D,E,F,G,H,I(假设每层节点从左到右访问)。 先往队列中插入左节点,再插右节点,这样出队就是先左节点后右节点了。
广度优先遍历树,需要用到队列(Queue)来存储节点对象,队列的特点就是先进先出。
2.深度优先
英文缩写为DFS即Depth First Search.其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次。
对于上面的例子来说深度优先遍历的结果就是:A,B,D,E,I,C,F,G,H.(假设先走子节点的的左侧)。 深度优先遍历各个节点,需要使用到栈(Stack)这种数据结构。
stack的特点是是先进后出。整个遍历过程如下: 先往栈中压入右节点,再压左节点,这样出栈就是先左节点后右节点了。
https://www.cnblogs.com/xiaolovewei/p/7763867.html
常见的深度遍历次序:先序遍历、中序遍历、后序遍历
有没有发现其实就是‘根’的位置发生了改变,前就是‘根’在前,中在中,后在后。
https://blog.csdn.net/dingqianyi2007/article/details/79585153
一、先序遍历
二、中序遍历
三、后序遍历
树的遍历有何实际用途
1.输出文件名称的过程如下:
如果是文件夹,先输出文件夹名,然后再依次输出该文件夹下的所有文件(包括子文件夹),如果有子文件夹,则再进入该子文件夹,输出该子文件夹下的所有文件名。这是一个典型的先序遍历过程。
2.统计文件夹的大小过程如下:
若要知道某文件夹的大小,必须先知道该文件夹下所有文件的大小,如果有子文件夹,若要知道该子文件夹大小,必须先知道子文件夹所有文件的大小。这是一个典型的后序遍历过程。
3.中缀表达式转为后缀表达式(逆波兰表达式)。
中缀表达式是一个通用的算术或逻辑公式表示方法。符合人类的逻辑(例:3 + 4)
后缀表达式是一种不需要括号的表达法。符合计算机的逻辑(例:3 4 +)
资料
https://www.cnblogs.com/mfrank/p/9227097.html
http://www.ruanyifeng.com/blog/2014/07/database_implementation.html
https://www.cnblogs.com/wmyskxz/p/9295862.html
https://www.cnblogs.com/CareySon/archive/2012/04/06/Imple-BTree-With-CSharp.html