23树和森林的存储和遍历

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

A
B E F
C
D
G
求根到所有叶子结点的路径
A B E C D G 左图的输出结果为:
F
H I J K
A A A A A A
B B C D D D
E F
G H I G H J G H K
求根到所有叶子结点的路径
对树先根遍历(深度优先) ,设立一个栈
1、T为空,则栈中存放的是从根到T的父结点的路径 2、将T压栈,栈中存放的是从根到T的路径 3、递归访问T的子树
B E F A C D G H I J K
树和森林的遍历
一、树的遍历 二、森林的遍历 三、树的遍历的应用
树的先根遍历
若树不空,则先访问根结点,然后依次(?)先根遍历各棵子树。
先根遍历序列为: A B E F C D G H I J K
A BEF CDGHIJK
课堂练习
A B C D F H I J
d[p]=Depth(p) a=max(d[1],d[2],…d[n])
return(a+1) }
求树的深度
int Depth(CSTree T){//二叉链表作为存储结构
if (!T) return 0;//空树
A B E F C D G
p=T->firstchild; d=0;
while(p){//依次求子树的深度 d1 = Depth(p); if(d1>d) d=d1; p=p->nextsibling; } return (d+1); }
E
G
F
D
可见,算法中需要一个队列保 存已建好的结点的指针
作业14
1、给出左侧树的双亲表示法、孩子兄弟表示法的存储结构。 2、给出右侧树的先根、后根和层次遍历结果。
A
L
D G H I J K
B
E F
C
M
P
N
Q
O
R
森林的先序遍历
A F H I K K JJ
森林对应的二叉链表
A B C D E E K G F
B
C
D D
E E
G
H I
J
先序遍历序列为: ABCDE FG HIKJ
课堂练习
B E F A C D G H I J K
森林的中序遍历
森林不空,则 中序遍历森林中第一棵树的子树森林; 访问森林中第一棵树的根结点; 中序遍历森林中(除第一棵树之外)其余树构成的森林。
ABCDEFGHIJK
C
D D G H II J K
树的先根遍历-二叉链表 的对应关系
A B C D G 先根遍历 ABEFCDG 结论:先根对应先序
A
B
E F
C
D
E
F
G
树的后根遍历-二叉链表 的对应关系
A
A
B
B
E F
C
D
G
E F
C D
G
后根遍历 EFBCGDA 结论:后根对应中序
森林的遍历
B E F C D
E
G
树的后根遍历
若树不空,则先依次后根遍历各棵子树,然后访问根结点。
后根遍历序列为:
A A B B E E F C D D G H
E F BCI J K H G D A
I
J
K
课堂练习
A B C D F H I J
E
G
树的层次遍历
若树不空,则自上而下自左至右访问树中每个结点。
按层次遍历序列为:
A B E E F F
G
0 1 2 3 4 5 6
-1 0 0 0 2 2 5
A B C D E F G
1
4
2
5
3
6
root=0 n=7
二叉链表 root
A B E C F G G
G 孩子兄弟表示法
A D B
A B
C
E F D
C E F D
树的存储课堂练习
A B E F C D G H I J K
森林=>二叉链表
A B B A B C D E F H G E I F J G H I J J H I F G E A
A B E B F C D G
A E C F G
D
}利用二者的先序遍历结果相同
构造树
和二叉树类似,不同的定义相应有不同的算法。 假设以二元组(F,C)的形式自上而下、自左而右依 次输入树的各边,建立树的孩子-兄弟链表。
构造树
对左侧所示树的输入序列应为: A B C D
(‘#’, ‘A’) (‘A’, ‘B’) (‘A’, (‘A’, ‘C’) ‘C’) (‘A’, (‘A’, ‘D’) ‘D’) (‘C’, (‘C’, ‘E’) ‘E’) (‘C’, ‘F’) (‘E’, ‘G’) (‘ ‘,’#’) A B C
C
D
C
D
森林=>二叉链表
A B
C
D E F G H I J B C
A E F D H I J G
二叉链表=>森林
A A B C D F H I J E G F B
C
D
E
G H
I J
二叉链表=>森林
A B C D E F G H I J H Leabharlann Baidu I J E F B C D A
二叉链表=>森林 课堂练习
依次从左至右对森林中的每一棵树进行后根遍历。
森林的中序遍历
A B C D D E E F G I K K E E A H B J J C D K G I J F H
中序遍历序列为:
BCEDAGF KIJH
课堂练习
B E F A C D G H I J K
遍历的对应关系
树 森林 二叉树
先根遍历
后根遍历
树的存储结构
一、双亲表示法 二、孩子链表表示法
三、带双亲的孩子链表表示法
四、树的孩子兄弟表示法
顺序存储
A
B E C F G D
data
0 1 2 3 4 5 6 A B C D E F G
parent -1 0 0 0 2 2 5
root=0 n=7
双亲表示法:图中A,B。。。是<Key, Value>
森林可以分解成三部分:
1.森林中第一棵树的根点; 2.森林中第一棵树的子森林; 3.森林中其它树构成的森林。
K
G
H I J
森林的先序遍历
若森林不空,则 1)访问森林中第一棵树的根结点; 2)先序遍历森林中第一棵树的子树森林; 3)先序遍历森林中(除第一棵树之外)其余树构成的森林。
依次从左至右对森林中的每一棵树进行先根遍历。
链式存储
a.结点同构
b.结点异构
如何描述节点可以有可变个指针,参见跳表
顺序+链式存储
A
data firstchild
0 A B C D E F G
1
2
3
B
E
C
F
D
1 2 3 4 5
4
5
root=0 n=7
6
G
6
孩子链表:找孩子方便,如何找双亲?
顺序+链式存储
A B E C F D
Parent data firstchild
先序遍历
中序遍历
先序遍历
中序遍历
求树的深度
1、如果T为空,则树的深度为0 2、求出T每棵子树的深度 3、从所有子树的深度中取最大,然后 加1,即为树的深度。 B A C D
E
F
G
求树的深度
int Depth(Tree T){//只考虑逻辑结构 if(!T) return(0); for(p=T1,T2,…Tn){//每棵子树
4、将T出栈
树的遍历的应用
void OutPath( CStree T, Stack& S ) {
if(!T) return; Push(S, T->data ); if(!T->firstchild) {//”叶子”节点 printStack(S); pop(S);} OutPath(T->firstchild, S ); OutPath( T->nextsibling, S );
相关文档
最新文档