中序遍历和线索化二叉树精

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

A B
C
D
E
F
G
6.3.2 线索二叉树
?遍 历 是 非 线 性 结 构 的 线 性 化 操 作 保留遍历过程的顺序信息 -----
? 线索二叉树的表示 : ? 若结点有左子树,则其 LCHILD域指示其左孩子,
否则令LCHILD域指示其前驱; ? 若结点有右子树,则其 RCHILD 域指示其右孩子,
? 如何在中序线索二叉树中找结点的前驱:
? ltag = 1时,lchild所指的结点即为前驱; ? ltag = 0时,其前驱为遍历其左子树时的最后一个结
点(最右下结点)。 ? 如根结点 “-”的前驱是“d”。
中序线索二叉树
否则令 RCHILD 域指示其后继。
线索二叉树结点的结构 :
?
0 lchild 域指示其左孩子
? ltag ={
?
1 lchild 域指示其前驱
?
0 rchild 域指示其右孩子
? rtag ={
?
1 rchild 域指示其后继
? 线索二叉树
? 线索化 ? 线索链表
lchild ltag data rtag rchild
A
B
E
C DG
? CFDBGEA
F
后序遍历二叉树的递归算法
? Status PostOrderTraverse(BiTree T, Status(* Visit)(TElemType e)){ if (T){ if (PostOrderTraverse(T->lchild,Visit)) if (PostOrderTraverse(T->rchild,Visit)) if (Visit(T->data)) return OK; return ERROR; }else return OK; }//PostOrderTraverse
中序遍历二叉树的非递归算法
? Status InOrderTraverse(BiTree T, Status(* Visit) (TElemType e)){ InitStack(S); Push(S,T);
? while(!StackEmpty(S)){
? while(GetTop(S,p) && p)Push(S,p->lchild); Pop(S, p); if (!StackEmpty(S)){ Pop(S,p); if (!Visite(p->data)) return ERROR;
6.3遍历二叉树和线索二叉树
? 6.3.1遍历二叉树
? 如果按某条搜索路径巡 访树中每个结点,使得 每个结点均被访问一次, 而且仅被访问一次。
A B
C
D
E
F
G
先序遍历二叉树的操作定义为:
? 若二叉树为空,则空操作;
否则
A
? (1)访问根结点;
? (2)先序遍历左子树;
B
E
? (3)先序遍历右子树。
C
DG
? ABCDFEG
F
先序遍历二叉树的递归算法
? Status PreOrderTraverse(BiTree T, Status(*
Visit)(TElemType e)){
? if (T){
? if (Visit(T->data))
? if (PreOrderTraverse(T->lchild,Visit))
?
if (PreOrderTraverse(T->rchild,Visit))
?
return OK;
? return ERROR;
? }else return OK;
? }//PreOrderTraverse
中序遍历二叉树的操作定义为:
? 若二叉树为空,则空操作; 否则
? (1)中序遍历左子树; ? (2)访问根结点; ? (3)中序遍历右子树。
?
exit(OVERFLOW);
T->data = ch ;
? CreateBiTree(T->lchild);
? CreateBiTree(T->rchild);
?}
? return OK; }//CreateBiTree
构造二叉链表
按下列次序输入字符: ABC??DE?G??F??? (其中?表示空格字符) 可建立如右图的二叉链表.
A
A
C
F
B
F
B
G
G
E
CD
D
E
A BF CDG E
构造二叉链表表示的二叉树 的递归算法
? Status CreateBiTree(BiTree &T)
? { scanf(“%c”,&ch); if (ch==‘#') T=NULL;
? else { if (!(T=(BiTNode *) malloc(sizeof (BiTNode))))
? CBDFAG E
A
B
E
C DG
F
中序遍历二叉树示例
? 中序遍历二叉树得:
-
பைடு நூலகம்? a+b*(c-d)-e/f
+
/
a
*e
f
b-
c
d
中序遍历二叉树的递归算法
? Status InOrderTraverse(BiTree T, Status(*
Visit)(TElemType e)){
if (T){ if (InOrderTraverse(T->lchild,Visit))
? 线索
中序线索二叉树
-
NIL +
/
a
*e
f
b-
NIL
+
*
1b 1 0/ 0
c
d
e
f
中序线索二叉树中 查找结点的后继和前驱 :
? 如何在中序线索二叉树中找结点的后继:
? rtag = 1时,rchild所指的结点即为后继; ? rtag = 0时,其后继为遍历其右子树时的第一个结点
(最左下结点)。 ? 如结点 “*”的后继是“c”。
if (Visit(T->data))
if (InOrderTraverse(T->rchild,Visit))
?
return OK;
return ERROR;
}else return OK;
}//InOrderTraverse
后序遍历二叉树的操作定义为:
? 若二叉树为空,则空操作; 否则
? (1)后序遍历左子树; ? (2)后序遍历右子树; ? (3)访问根结点。
?
Push(S,p->rchild);
} } return OK;
}//InOrderTraverse
中序遍历二叉树的 非递归算法 示意图
Pop GetTop<-- NULL
C
p
p
B
A A
S S
? CBDFA
A
B
E
C DG
F
? CBDFAGE
例: 已知结点的先序序列和中序 序列,求整棵二叉树。
? 先序序列:A B C D E F G ? 中序序列:C B E D A F G
相关文档
最新文档