前言
请跟着上一讲http://blog.youkuaiyun.com/jurbo/article/details/52595821继续学习
3.1 树与树的表示
3.1.1 引子(顺序查找)
什么是树
客观世界中许多事物存在层次关系
- 人类社会家谱
- 社会组织结构
- 图书信息管理
分层次组织在管理上具有更高的效率!
数据管理的基本操作之一:查找
如何实现有效率的查找?
查找
查找:根据某个给定关键字K,从集合R中找出关键字与K相同的记录
静态查找:集合中记录是固定的(查字典)
- 没有插入和删除操作,只有查找
动态查找:集合中记录是动态变化的
- 除查找,还可能发生插入和删除
静态查找
方法1:顺序查找
顺序查找的一种实现(无“哨兵”)
3.1.2 引子(二分查找例子)
方法2:二分查找
【例】假设有13个数据元素,按关键字由小到大顺序存放。二分查找关键字为444的数据元素过程如下:
【例】仍然以上面13个数据元素构成的有序线性表为例。二分查找关键字为43的数据元素如下:
3.1.3 引子(二分查找实现)
二分查找算法
int BinarySearch(List Tbl,ElementType K)
{
//在表Tbl中查找关键字为K的数据元素
int left,right,mid,NoFound=-1;
left=1;
right=Tbl->Length;
while(left<=right)
{
mid=(left+right)/2;
if(K<Tbl->Element[mid])
right=mid-1; //调整右边界
else if(K->Tbl->Element[mid])
left=mid+1; //调整左边界
else
return mid; //查找成功,返回数据元素的下标
}
return NotFound;
}
11个元素的二分查找判定树
3.1.4 树的定义和术语
树的定义
树:n(n>=0)个结点构成的有限集合。
当n=0时,称为空树。
对于任一颗非空树(n>0),它具备以下性质:
树与非树?
树的一些基本术语
3.1.5 树的表示
儿子-兄弟表示法
3.2 二叉树及存储结构
3.2.1 二叉树的定义及性质
二叉树的定义
二叉树T:一个有穷的结点集合,这个集合可以为空,若不为空,则它是由根结点和称为其左子树和右子树的两个不相交的二叉树组成。
特殊二叉树
二叉树几个重要性质
二叉树的抽象数据类型定义
3.2.2 二叉树的存储结构
顺序存储结构
链表存储
3.3 二叉树的遍历
3.3.1 先序中序后序遍历
先序遍历
遍历过程
- 访问根结点
- 先序遍历其左子树
- 先序遍历其右子树
中序遍历
遍历过程
- 中序遍历其左子树
- 访问根结点
- 中序遍历其右子树
后序遍历
遍历过程
- 后序遍历其左子树
- 后序遍历其右子树
- 访问根结点
3.3.2 中序非递归实现
二叉树的非递归遍历
中序遍历非递归遍历算法
3.3.3 层次遍历
二叉树遍历的核心问题:二维结构的线性化
- 从结点访问其左,右儿子结点
- 访问左儿子后,右儿子结点怎么办?
需要一个存储结构保存暂时不访问的结点
存储结构:堆栈、队列
队列实现
遍历从根结点开始,首先将根节点入队,然后开始执行循环:结点出队、访问该结点、其左右儿子入队
3.3.4 遍历应用例子
遍历二叉树应用:输出二叉树中的叶子结点
在二叉树的遍历算法中增加检测结点的“左右子树是否都为空”
求二叉树的高度
二元运算表达式树及其遍历
由两种遍历序列确定二叉树
答案是:必须要有中序遍历才行
先序和中序遍历序列来确定一颗二叉树