树
1 树与树的表示
1.1 什么是树
硬盘的文件管理也存在层次关系
为什么要用分层次组织?
分层次组织在管理上具有更高的效率
数据管理的基本操作之一:查找
如何实现有效率的查找?
使用一个数组:数组下标为0的地方不存储要查找的一堆值,而存待查找的那个值(哨兵)
设置哨兵,不需要每次判断下标是否达到边界
返回值:
1、等于0:没找到
2、不等于0:找到了
由此可见,顺序查找效率不高,引出二分查找
找得到的情况:
找不到的情况:
(每次查找范围都是除2除2除2。。。)
1.2 树的定义
树的一些基本术语
上面的树的度为3
1.3 树的表示
用数组实现不容易知道一个节点的父节点子节点等等
但是树的子节点的个数不好控制,结点的结构不统一
假设A节点有3个子节点,则把其他的节点也都设置为只有3个子节点的相同结构,这样处理起来比较方便,但是这样做会有3n个指针域,只有n-1条边即n-1个指针域非0,会造成2n+1个指针域的空间浪费
所以引入儿子-兄弟表示法
优点:结构同一,都是2个指针域,空间浪费也不大(空域2n-(n-1)=n+1)
次子的次子:结果BCG3个节点(假设下图G有兄弟结点)
长子的长子的长子的长子:经过BEK3个节点(假设K有子结点)
2 二叉树及存储结构
2.1 二叉树的定义
普通的度为2的树无左右之分
上图是完全二叉树
上图不是完全二叉树
2.2 二叉树几个重要性质
2.3 二叉树的抽象数据类型定义
2.4 二叉树的存储结构
2.4.1 顺序存储结构
2.4.2 链表存储
2.4.3 二叉树的遍历
先序遍历(根左右)
中序遍历(左根右)
后序遍历(左右根)
第1次碰到就输出:先序
第2次碰到就输出:中序
第3次碰到就输出:后序
递归是用堆栈实现的
2.4.4 二叉树的非递归遍历(直接使用堆栈)
中序
先序
第一次碰到就输出
后序
2.4.5 二叉树的层序遍历
二叉树遍历:把二维变为一维
堆栈是把自己保存起来
队列是保存右儿子
A入队
接下来开始做循环
- 从队列中抛出1个(A)
- 然后将其左儿子右儿子入队(BC)
2.4.6 二叉树遍历应用例子
通过加括号可以解决中缀表达式存在的问题
一个子树的左子树前加左括号,右子树后加右括号