第12讲线索二叉树

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
template <class ElemType> void InThreadBinTree<ElemType>::InOrder (
void (*Visit)(const ElemType &)) { if (r != NULL) {
ThreadBinTreeNode <class ElemType> *cur=root; while(cur->leftTag==CHILD_PTR)
cur=cur->leftChild; } } } }
17
本讲小结
重点: 1、线索二叉树
难点: 1、线索二叉树的应用
18
Homework:
1、写算法求中序线索二叉树中给定值为x
的结点之后继结点,返回该后继结点的指针。 (请编程实现)
19
leftTag =
0 leftChild域指示结点的左孩子 1 leftChild域指示结点的前驱
rightTag = 0 rightChild域指示结点的右孩子 1 rightChild域指示结点的后继
5
一、线索二叉树
○A
中序线索二叉树:
○B
○C
○D ○E ○F ○G
○H ○I
图中的虚线箭头即为新加上的线索。 6
if(cur->leftChild == NULL)
{
cur->leftChild = pre;
cur->leftTag = THREAD_PTR;
}
else
{
cur->leftTag = CHILD_PTR;
}
11
一、线索二叉树 中序线索化算法
if(pre != NULL && pre->rightChild == NULL) {
13
一、线索二叉树
(3) 中序线索树求前趋结点
找前趋结点相应的原则如下:
a) 如果某结点的左线索标志域为1,说明其左指针域 是线索,这个线索所指的即是该结点的前趋结点; b) 如果某结点的左线索标志为0,则其左指针域是指 向左儿子结点的指针,由此结点的左儿子结点起按右 指针域指针逐结点向右查找,一直找到右线索标志域 为1的结点,即是该结点的前趋结点。
(1) 中序线索化
对一个二叉树进行中序线索化的算法基本思想是: 一边中序遍历一边建立线索。
a) 若访问结点的左孩子结点为空,则建立前趋线索; b) 若右孩子结点为空,则建立后继线索。
为此附设一个指针pre始终指向刚刚访问过的结 点,而用指针cur指示当前正在访问的结点。pre 的初始值为NULL。
10
} }
12
一、线索二叉树
(2) 中序线索树求后继结点
在中序遍历线索树过程中,按下述两条原则即可 找到后继结点:
a) 如果某结点的右线索标志域为1,说明其右指针域 是线索,这个线索所指的即是该结点的后继结点; b) 如果某结点的右线索标志为0,则其右指针域是指 向右儿子结点的指针,由此结点的右儿子结点起按左 指针域指针逐结点向左查找,一直找到左线索标志域 为1的结点,即是该结点的后继结点。
pre->rightChild = cur; pre->rightTag = THREAD_PTR; } else if (pre != NULL) { pre->rightTag = CHILD_PTR; } pre = cur;
if (cur->rightTag == CHILD_PTR) InThreadHelp(cur->rightChild, pre);
A
B
E
先序序列 ABCDEFGHK
C
F
中序序列
D
பைடு நூலகம்
G
HK
BDCAHGKFE 后序序列
DCBHKGFEA
2
指向该线性序列中的“前驱”和 “后继” 的指针,称作“线索”
ABCDEFGHK
^B
E^
C^
^D^
包含 “线索” 的存储结构, 称作 “线索链表”
与其相应的二叉树, 称作 “线索二叉树”
3
一、线索二叉树
一、线索二叉树 中序线索化算法
void InThreadHelp(ThreadBinTreeNode *cur, ThreadBinTreeNode *&pre)
{ if (cur != NULL) { if (cur->leftTag == CHILD_PTR) InThreadHelp(cur->leftChild, pre);
一、线索二叉树
定义:线索、线索化、线索二叉树
在一个n结点的链式存储二叉树中,有n+1个指 针域是空指针域,可以把每个空指针域用于存放分 别指向某种遍历次序的前趋和后继结点的指针。
在结点的空指针域中存放的该结点在某遍历次 序下的前趋结点和后继结点的指针叫做线索。
1
遍历二叉树的结果是, 求得结点的一个线性序列
cur=cur->leftChild;
16
中序线索二叉树的遍历算法
while(cur!=NULL) {
(*visit)(cur->data); if (cur->rightTag==THREAD_PTR)
cur=cur->rightChild; else {
cur=cur->rightChild; while(cur->leftChild==CHILD_PTR)
定义:线索、线索化、线索二叉树
把某结点原来空的左(右)指针域用于存 放指向其前趋(后继)结点的指针,也叫左( 右)线索。
对一个二叉树中的所有结点的空指针域按 照某种遍历次序加线索的过程叫作线索化,被 线索化了的二叉树称作线索二叉树。
4
一、线索二叉树
增加两个标志域:
leftChild leftTag data rightTag rchildChild
一、线索二叉树
前序序列 ABDCE
后序序列 DBECA
7
一、线索二叉树
带表头结点的中序线索二叉树
8
实战:
1、对于下图二叉树,画出其前序线索二叉树、 中序线索二叉树和后序线索二叉树。
A
B
C
D EF
G
H
2、n个结点的线索二叉树上含有线索数为() A 2n B n-1 C n+1 D n
9
一、线索二叉树
14
一、线索二叉树
(4) 中序遍历线索树 P217
a)先由根结点指针找到根结点,从根结点起沿 左指针逐结点一直向左查找,找到左线索标志 为1的结点(“最左”的结点)即为遍历中需首先 访问的结点。 b)由此结点开始,反复进行寻找后继结点的过 程,并陆续访问这些结点,直至结束。
15
中序线索二叉树的遍历算法
相关文档
最新文档