序言
为什么需要树结构?
1.数组存储方式的分析
优点:通过下标方式访问元素,速度快。对于有序数组,还可使用二分查找提高检索速度。
缺点:如果要检索具体某个值,或者插入值(按一定顺序)会整体移动,效率较低。
2.链式存储方式的分析
优点:在一定程度上对数组存储方式有优化(比如:插入一个数值节点,只需要将插入节点,链接到链表中即可, 删除效率也很好)。
缺点:在进行检索时,效率仍然较低,比如(检索某个值,需要从头节点开始遍历) 。
3.树存储方式的分析
能提高数据存储,读取的效率, 比如利用二叉排序树(Binary Sort Tree),既可以保证数据的检索速度,同时也可以保证数据的插入,删除,修改的速度。
树的概述
树的存储
树的顺序存储
顺序存储二叉树应用实例
八大排序算法中的堆排序,就会使用到顺序存储二叉树, 关于堆排序,我们放在<<树结构实际应用>> 章节讲解
先序遍历、中序遍历、后序遍历
线索二叉树
树的链式存储
先序遍历、中序遍历、后序遍历
二叉树
二叉查找树是一种查找效率非常高的数据结构,它有三个特点。
- 每个节点最多只有两个子树。
- 左子树都为小于父节点的值,右子树都为大于父节点的值。(左<父<右)
- 在n个节点中找到目标值,一般只需要log(n)次比较。
二叉查找树的结构不适合数据库,因为它的查找效率与层数相关。越处在下层的数据,就需要越多次比较。极端情况下,n个数据需要n次比较才能找到目标值。
对于数据库来说,每进入一层,就要从硬盘读取一次数据,这非常致命,因为硬盘的读取时间远远大于数据处理时间,数据库读取硬盘的次数越少越好。
树的遍历
1.广度优先遍历——Queue
从根节点开始,沿着树的宽度依次遍历树的每个节点。
我们借助队列结构来实现树的广度优先遍历。上图的遍历结果为:ABCDEFG
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
Queue<Node> queue = new LinkedBlockingQueue<Node>(); List<Node> result = new ArrayList<Node>(); queue.add(root); while (!queue.isEmpty()) { Node first = queue.poll(); result.add(first); List<Node> children = first.getChildren(); if (children != null && children.size() > 0) { for (int i = 0; i < children.size(); i++) { queue.add(children.get(i)); } } }
2.深度优先遍历——stack
深度优先遍历指的是,从树的根节点开始,先遍历左子树,然后遍历右子树。
我们借助栈结构来实现深度优先遍历。上图的深度优先遍历结果为:ABDECFG
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
Stack<Node> stack = new Stack<Node>(); List<Node> result = new ArrayList<Node>(); stack.push(root); while (!stack.isEmpty()) { Node top = stack.pop(); result.add(top); List<Node> children = top.getChildren(); if (children != null && children.size() > 0) { for (int i = children.size() - 1; i >= 0; i--) { stack.push(children.get(i)); } } }
常见的深度遍历次序:先序遍历、中序遍历、后序遍历
有没有发现其实就是‘根’的位置发生了改变,前就是‘根’在前,中在中,后在后。
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