数据结构-树2汇总
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
✓ 该算法的时间 复杂度不超过 树的高度h, 即O(h)
P
p 0N0
R1 0
R2 0
最右下结点
在中序线索二叉树中, 查找结点p的中序前驱 结点,与找中序后继结 点的方法完全对称
Rr 1
(a)
(b)
图5.16 结点p的左子树非空时,其中 序前驱结点是RK
后序线索二叉树中查找后序结点
NULL B
C
A E
第六章 树和二叉树
✓ 二叉树的定义、性质和存储结构 ✓ 二叉树的遍历和线索化 ✓ 树的定义和存储结构 ✓ 树、森林与二叉树转换 ✓ 树和森林的遍历以及树的应用
线索二叉树的定义
lchild ltag data rtag rchild
✓ 线索:指向前驱或 后继结点的指针称 为线索
✓ 线索二叉树:加上 了线索的二叉链表 称为线索链表,相 应的二叉树称为线 索二叉树
,再到其祖父等,从而求出根
9i
5
✓ 查询孩子和兄弟的信息困难
一般树的表示—孩子链表示法
data fc 0
a
bc
de
f
1a
2
2b
4
3^ 5^
gh i
3c
6^
4 d^
5e
7✓ 特点 8
9^
6 f ^ ✓ 孩子结点的数据域存放它们在数组
7 g^
中的p序ub号lic class Node
8 h ^ ✓ 便于{实现有关孩子及其子孙的运算
A
EG
A
E
G
B
C D FH I
B C
F
H I
J
D A
J
A
E
B
F
C
D
G H
I J
B
E
G CF
DH I
J
✓ 二叉树转换成森林 ✓ 抹线:将二叉树中根结点与其右孩子连线,及沿右分支搜索 到的所有右孩子间连线全部抹掉,使之变成孤立的二叉树
✓ 还原:将孤立的二叉树还原成树
A
B
E
G CF
DH I
J
A
B
E
G CF
00
9
存结点个数
最大结点数 int data;//数据域 int parent;//双亲域
1a 0 2b 1
a bc
Tnode tree[] = new Tnode[MAXNODE+1]; //静态双亲链表
3c 1
de
f}
4d 2
5e 2
6f
3
7g 5
8h 5
gh i
✓ 特点 ✓ 寻找父结点只需要O(1)时间 ✓ 可以从一个结点出发,到其父亲
A
A
A
B CD
B CD
B CD
E F G H I E F G H IE F G H I
A
A B CD
B
E
C
F
D
树转换成的二叉树 其右子树一定为空
E FGH I
GH
I
✓ 将二叉树转换成树
✓ 加线:若p结点是双亲结点的左孩子,则将p的右孩子 ,右孩子的右孩子,……沿分支找到的所有右孩子, 都与p的双亲用线连起来
F
G
D
H
I
图5.17 后序线索二叉树
✓ 查找指定结点p的后序前驱结点 ✓ 若p的左子树为空 ✓ 若p的左子树为非空
后序线索二叉树中查找后序结点
NULL B
C
A E
F
G百度文库
D
H
I
图5.17 后序线索二叉树
✓ 查找指定结点p的后序后继结点 ✓ 若p是根 ✓ 若p是其双亲的右孩子 ✓ 若p是其双亲的左孩子,但p无右兄弟 ✓ 若p是其双亲的左孩子,但p右右兄弟
✓ 抹线:抹掉原二叉树中双亲与右孩子之间的连线
✓ 调整:将结点按层次排列,形成树结构
A B EC FD
B E
F
A
C D
B E
F
A
C D
B E
F
A
C D
GH I
GH
A
I
GH I
GH I
B CD
E FGH I
✓ 森林转换成二叉树
✓ 将各棵树分别转换成二叉树
✓ 将每棵树的根结点用线相连
✓ 以第一棵树根结点为二叉树的根,再以根结点为轴心,顺 时针旋转,构成二叉树型结构
1D1
1F 0 0G0
1 H1
(b)中序线索链表
1 I1
图5.14 中序线索二叉树及其存储结构
线索化二叉树
✓ 定义 ✓ 将二叉树变为线索二叉树的过程为线索化
✓ 算法 ✓ 二叉树中根序线索化
✓ 时间复杂度为:O(n)
详见算法5.9
线索二叉树上的运算—查找
P
✓ 查找某结点p在指定次 序下的前驱和后继结点
2 4 6^
3^ 5^
7
8
a
bc
de
f
gh i
9^
一般树的表示—孩子兄弟表示法
b ^d
a^ c^
e^ ^ f ^
a
bc
de
f
gh i
^g
^ h ^ i^
树与二叉树
a^
b
c^
a bc de f
gh i
^d
e^ ^f ^
b
^ g ^ h ^ i^
^d
a^ c^
public class Tnodetp{ int data; Tnodetp fch,nsib;
}
e ^ ^ f^ ^g
^h
✓操作容易,但改变了树的层次
^ i^
二叉树与树之间的转换
树 A
BCE
D ^
A^
^B
C
^E ^
^D ^
二叉树 A
B C
D
E
A^
^B
C
^D^
^E^
✓ 将树转换成二叉树 ✓ 加线:在兄弟之间加一连线 ✓ 抹线:对每个结点,除了其第一孩子外,去除其与其 余孩子之间的关系 ✓ 旋转:以树的根结点为轴心,将整棵树顺时针转45°
N R1
✓ 中序后继分两种情形
R2
✓ p的右子树空 ✓ 即p.rtag为Thread Rk
✓ p的右子树非空
最右下结点 P
(a)
✓ 即p.rtag为Link
N0
0
R1
结点p的右子树非空时
0
R2
其中序后继结点是RK (b) 1 Rk
查找线索二叉树上的中序后继结点 详见算法5.10
✓ 算法
✓ 时间复杂度
遍历中序线索二叉树
✓ 遍历某种次序的线索二叉树,只要从该次序下的 开始结点出发,反复找到结点在该次序下的后继 ,直至终端结点。
✓ 时间复杂性为:O(n)
详见算法5.11
一般树的表示—双亲表示法
public class final int
Tnode { MAXNODE
=
100;//
data parent 0号单元不用或
9
i^
✓ 不便于实iNn现otdce与hinld双ex; t亲; 有关的运算
Node tree[] = new Node[MAXNODE +1];
}
一般树的表示—双亲孩子链表示法
data parent fc 1a 0 2b 1 3c 1 4d 2 ^ 5e 2 6f 3 ^ 7g 5 ^ 8h 5 ^ 9i 5 ^
✓ 左标志ltag=0:表示lchild 是指向结点的左孩子的指 针,否则,为指向结点的 前驱的左线索。
✓ 右标志rtag=0:表示 rchild是指向结点的右孩 子的指针,否则,为指向 结点的后继的右线索。
线索二叉树的示例
A
B
E
F
G
C
D
H
I
(a)中序线索二叉树
NULL
0 B0
0A 0
0E 1
1C1
DH I
J
B
A
E
B
F
C
D
G H
I J
A
EG
C D FH I
J
一般树的遍历
✓ 先根序遍历(与对应的二叉树先根遍历序列一致)
P
p 0N0
R1 0
R2 0
最右下结点
在中序线索二叉树中, 查找结点p的中序前驱 结点,与找中序后继结 点的方法完全对称
Rr 1
(a)
(b)
图5.16 结点p的左子树非空时,其中 序前驱结点是RK
后序线索二叉树中查找后序结点
NULL B
C
A E
第六章 树和二叉树
✓ 二叉树的定义、性质和存储结构 ✓ 二叉树的遍历和线索化 ✓ 树的定义和存储结构 ✓ 树、森林与二叉树转换 ✓ 树和森林的遍历以及树的应用
线索二叉树的定义
lchild ltag data rtag rchild
✓ 线索:指向前驱或 后继结点的指针称 为线索
✓ 线索二叉树:加上 了线索的二叉链表 称为线索链表,相 应的二叉树称为线 索二叉树
,再到其祖父等,从而求出根
9i
5
✓ 查询孩子和兄弟的信息困难
一般树的表示—孩子链表示法
data fc 0
a
bc
de
f
1a
2
2b
4
3^ 5^
gh i
3c
6^
4 d^
5e
7✓ 特点 8
9^
6 f ^ ✓ 孩子结点的数据域存放它们在数组
7 g^
中的p序ub号lic class Node
8 h ^ ✓ 便于{实现有关孩子及其子孙的运算
A
EG
A
E
G
B
C D FH I
B C
F
H I
J
D A
J
A
E
B
F
C
D
G H
I J
B
E
G CF
DH I
J
✓ 二叉树转换成森林 ✓ 抹线:将二叉树中根结点与其右孩子连线,及沿右分支搜索 到的所有右孩子间连线全部抹掉,使之变成孤立的二叉树
✓ 还原:将孤立的二叉树还原成树
A
B
E
G CF
DH I
J
A
B
E
G CF
00
9
存结点个数
最大结点数 int data;//数据域 int parent;//双亲域
1a 0 2b 1
a bc
Tnode tree[] = new Tnode[MAXNODE+1]; //静态双亲链表
3c 1
de
f}
4d 2
5e 2
6f
3
7g 5
8h 5
gh i
✓ 特点 ✓ 寻找父结点只需要O(1)时间 ✓ 可以从一个结点出发,到其父亲
A
A
A
B CD
B CD
B CD
E F G H I E F G H IE F G H I
A
A B CD
B
E
C
F
D
树转换成的二叉树 其右子树一定为空
E FGH I
GH
I
✓ 将二叉树转换成树
✓ 加线:若p结点是双亲结点的左孩子,则将p的右孩子 ,右孩子的右孩子,……沿分支找到的所有右孩子, 都与p的双亲用线连起来
F
G
D
H
I
图5.17 后序线索二叉树
✓ 查找指定结点p的后序前驱结点 ✓ 若p的左子树为空 ✓ 若p的左子树为非空
后序线索二叉树中查找后序结点
NULL B
C
A E
F
G百度文库
D
H
I
图5.17 后序线索二叉树
✓ 查找指定结点p的后序后继结点 ✓ 若p是根 ✓ 若p是其双亲的右孩子 ✓ 若p是其双亲的左孩子,但p无右兄弟 ✓ 若p是其双亲的左孩子,但p右右兄弟
✓ 抹线:抹掉原二叉树中双亲与右孩子之间的连线
✓ 调整:将结点按层次排列,形成树结构
A B EC FD
B E
F
A
C D
B E
F
A
C D
B E
F
A
C D
GH I
GH
A
I
GH I
GH I
B CD
E FGH I
✓ 森林转换成二叉树
✓ 将各棵树分别转换成二叉树
✓ 将每棵树的根结点用线相连
✓ 以第一棵树根结点为二叉树的根,再以根结点为轴心,顺 时针旋转,构成二叉树型结构
1D1
1F 0 0G0
1 H1
(b)中序线索链表
1 I1
图5.14 中序线索二叉树及其存储结构
线索化二叉树
✓ 定义 ✓ 将二叉树变为线索二叉树的过程为线索化
✓ 算法 ✓ 二叉树中根序线索化
✓ 时间复杂度为:O(n)
详见算法5.9
线索二叉树上的运算—查找
P
✓ 查找某结点p在指定次 序下的前驱和后继结点
2 4 6^
3^ 5^
7
8
a
bc
de
f
gh i
9^
一般树的表示—孩子兄弟表示法
b ^d
a^ c^
e^ ^ f ^
a
bc
de
f
gh i
^g
^ h ^ i^
树与二叉树
a^
b
c^
a bc de f
gh i
^d
e^ ^f ^
b
^ g ^ h ^ i^
^d
a^ c^
public class Tnodetp{ int data; Tnodetp fch,nsib;
}
e ^ ^ f^ ^g
^h
✓操作容易,但改变了树的层次
^ i^
二叉树与树之间的转换
树 A
BCE
D ^
A^
^B
C
^E ^
^D ^
二叉树 A
B C
D
E
A^
^B
C
^D^
^E^
✓ 将树转换成二叉树 ✓ 加线:在兄弟之间加一连线 ✓ 抹线:对每个结点,除了其第一孩子外,去除其与其 余孩子之间的关系 ✓ 旋转:以树的根结点为轴心,将整棵树顺时针转45°
N R1
✓ 中序后继分两种情形
R2
✓ p的右子树空 ✓ 即p.rtag为Thread Rk
✓ p的右子树非空
最右下结点 P
(a)
✓ 即p.rtag为Link
N0
0
R1
结点p的右子树非空时
0
R2
其中序后继结点是RK (b) 1 Rk
查找线索二叉树上的中序后继结点 详见算法5.10
✓ 算法
✓ 时间复杂度
遍历中序线索二叉树
✓ 遍历某种次序的线索二叉树,只要从该次序下的 开始结点出发,反复找到结点在该次序下的后继 ,直至终端结点。
✓ 时间复杂性为:O(n)
详见算法5.11
一般树的表示—双亲表示法
public class final int
Tnode { MAXNODE
=
100;//
data parent 0号单元不用或
9
i^
✓ 不便于实iNn现otdce与hinld双ex; t亲; 有关的运算
Node tree[] = new Node[MAXNODE +1];
}
一般树的表示—双亲孩子链表示法
data parent fc 1a 0 2b 1 3c 1 4d 2 ^ 5e 2 6f 3 ^ 7g 5 ^ 8h 5 ^ 9i 5 ^
✓ 左标志ltag=0:表示lchild 是指向结点的左孩子的指 针,否则,为指向结点的 前驱的左线索。
✓ 右标志rtag=0:表示 rchild是指向结点的右孩 子的指针,否则,为指向 结点的后继的右线索。
线索二叉树的示例
A
B
E
F
G
C
D
H
I
(a)中序线索二叉树
NULL
0 B0
0A 0
0E 1
1C1
DH I
J
B
A
E
B
F
C
D
G H
I J
A
EG
C D FH I
J
一般树的遍历
✓ 先根序遍历(与对应的二叉树先根遍历序列一致)