目录
5.5.1遍历二叉树
一.遍历
1.定义
顺着某一条搜索路径寻访二叉树中的结点,使得每个结点均被访问一次,而且仅被访问一次(又称周游)
2.目的
得到树中所有的一个线性排列
3.用途
它是树结构插入、删除、修改、查找和排序运算的前提,是二叉树一切运算的基础和核心
二.遍历二叉树算法描述
1.遍历方法
2.先序二叉树的操作定义(根左右)
3.中序遍历二叉树的操作定义(左根右)
4.后序遍历二叉树的操作定义(左右根)
三.根据遍历序列确定二叉树
1.根据遍历序列确定二叉树
- 若二叉树中各结点的值均不相同,则二叉树结点的先序序列、中序序列和后序序列都是唯一的
- 由二叉树的先序序列和中序序列,或由二叉树的后序序列和中序序列可以确定唯一一棵二叉树
2.由先和中序推二叉树
3.由中和后序推二叉树
四.遍历的算法实现--先序遍历
1.先序序列的递归算法
2.中序遍历的算法实现
3.后序遍历的算法实现
五.中序遍历非递归算法
1.二叉树中序遍历的非递归算法的关键
在中序遍历过某结点的整个左子树后,如何找到该结点的根以及右子树
2.建立思想
- 建立一个栈
- 根结点进栈,遍历左子树
- 根结点出栈,输在根结点,遍历右子树
3.算法实现
六.二叉树的层次遍历
1.定义
对于一颗二叉树,从根结点开始,按从上到下,从左到右的顺序访问每一个结点,每一个结点仅仅访问一次
2.算法设计思路:使用一个队列
(1)将根结点进队
(2)队不空时循环:从队列中出列一个结点*p,访问它;
- 若它有左孩子结点,将左孩子结点进队;
- 若它有右孩子,将右孩子结点进队。
3.算法实现
七.二叉树的建立
1.按先序遍历序列建立二叉树的二叉表
(1)例:已知先序序列为:ABCDEGF
- 从键盘输入二叉树的结点信息,建立二叉树的存储结构;
- 在建立二叉树的过程中按照二叉树先序方式建立;
2.唯一确定二叉树
八.复制二叉树
1.算法思路
(1)如果是空树,递归结束;
(2)否则,申请新结点空间,复制根结点
- 递归复制左子树
- 递归复制右子树
九.计算二叉树深度
1.算法思路
(1)如果是空树,则深度为0
(2)否则,递归计算左子树的深度记为m,递归计算右子树的深度记为n,二叉树的深度则为m与n的较大者加1
2.算法实现
十.计算二叉树结点总数
1.算法思路
(1)如果是空树,则结点个数为0
(2)否则,结点个数为左子树的结点个数+右子树的结点个数再+1
2.计算二叉树叶子结点数
(1)如果是空树,则叶子结点个数为0
(2)否则,为左子树的叶子结点个数+右子树的叶子结点个数
十一.线索二叉树
1.利用二叉链表中的空指针域
如果某个结点的左孩子为空,则将空的左孩子指针域改为指向其前驱;如果某结点的右孩子为空,则将空的右孩子指针域改为指向其后继——这种改变指向的指针称为“线索”
加上线索的二叉树称为线索二叉树,对二叉树按某种遍历次序使其变为线索二叉树的过程叫线索化
2.表示区分
为区分Irchid和rchild指针到底是指向孩子的指针,还是指向前驱或者后继的指针,对二叉链表中每个结点增设两个标志域Itag和rtag,并约定:
Itag=0 Ichild指向该结点的左孩子
Irag=1 Ichild指向该结点的前驱
rtag=0 rchild指向该结点的右孩子
rtag=1 rchild指向该结点的后继
5.6树和森林
一.树和森林
1.相关定义
(1)森林:是m(m》0)棵互不相交的树的集合
(2)树:是n(n》0)个结点的有限集。若n=0,称为空树
若n>0
- 有且仅有一个特定的称为根的结点
- 其余结点可分为m(m》0)个互不相交的有限集T1,T2,.....
二.树的存储结构
1.双亲表示法
(1)c语言的类型描述
2.孩子链表
(1)定义:把每个结点的孩子结点排列起来,看成是一个线性表,用单链表存储,则n个结点有n个孩子链表(叶子的孩子链表为空表)。而n个头指针又组成一个线性表,用顺序表(含n个元素的结构数组)存储。
(2)c语言的类型描述
3.孩子兄弟表示法(二叉树表示法)
(1)实现:用二叉链表作树的存储结构,链表中每个结点的两个指针域分别指向其第一个孩子结点和下一个兄弟结点
三.树与二叉树的转换
四.树与森林的遍历
1.树的遍历
(1)先根(次序)遍历
若树不空,则先访问根结点,然后依次先根遍历各棵子树
(2)后根(次序)遍历
若树不空,则先依次后根遍历各棵子树,然后访问根结点
(3)按层次遍历
若树不空,则自上而下自左而右访问树中每个结点
2.森林的遍历