当前位置:
文档之家› 中序遍历和线索化二叉树讲解学习
中序遍历和线索化二叉树讲解学习
+
*
1b 1 0/ 0
c
d
e
f
中序线索二叉树中 查找结点的后继和前驱:
如何在中序线索二叉树中找结点的后继:
• rtag = 1时,rchild所指的结点即为后继; • rtag = 0时,其后继为遍历其右子树时的第一个结点
(最左下结点)。 • 如结点 “*”的后继是“c” 。
如何在中序线索二叉树中找结点的前驱:
线索二叉树结点的结构:
0 lchild域指示其左孩子
ltag ={ 1 lchild域指示其前驱
0 rchild域指示其右孩子
rtag ={
1 rchild域指示其后继
线索二叉树
Hale Waihona Puke 线索化 线索链表lchild ltag data rtag rchild
线索
中序线索二叉树
-
NIL +
/
a
*e
f
b-
NIL
6.3遍历二叉树和线索二叉树
6.3.1遍历二叉树
如果按某条搜索路径巡 访树中每个结点,使得 每个结点均被访问一次, 而且仅被访问一次。
A B
C
D
E
F
G
先序遍历二叉树的操作定义为:
若二叉树为空,则空操作; 否则
(1)访问根结点; (2)先序遍历左子树; (3)先序遍历右子树。
C
A
B
E
DG
ABCDFEG
if (T){ if (InOrderTraverse(T->lchild,Visit))
if (Visit(T->data)) if (InOrderTraverse(T->rchild,Visit)) return OK;
return ERROR; }else return OK; }//InOrderTraverse
中序遍历二叉树的非递归算法
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)){
}else return OK; }//PreOrderTraverse
中序遍历二叉树的操作定义为:
若二叉树为空,则空操作; 否则 (1)中序遍历左子树; (2)访问根结点; (3)中序遍历右子树。
CBDFAG E
A
B
E
C
DG
F
中序遍历二叉树的递归算法
Status InOrderTraverse(BiTree T, Status(* Visit)(TElemType e)){
B
E
C
DG
F
CBDFAGE
例: 已知结点的先序序列和中序 序列,求整棵二叉树。
先序序列:A B C D E F G 中序序列:C B E D A F G
A
A
C
B F
F
B
G
G
E
CD
D
E
A BF CDG E
构造二叉链表表示的二叉树 的递归算法
Status CreateBiTree(BiTree &T) { scanf(“%c”,&ch);
typedef struct BiThrNode {
TElemType data;
struct BiThrNode *lchild,*rchild;
//左右孩子指针
PointerTag LTag,RTag;
Pop(S,p); if (!Visite(p->data)) return ERROR; Push(S,p->rchild); } } return OK; }//InOrderTraverse
中序遍历二叉树的非递归算法 示意图
Pop GetTop<-- NULL
C
p
p
B
A A
S S
CBDFA
A
• ltag = 1时,lchild所指的结点即为前驱; • ltag = 0时,其前驱为遍历其左子树时的最后一个结
点(最右下结点)。 • 如根结点 “-”的前驱是“d” 。
中序线索二叉树
// 二叉树的二叉线索存储表示
typedef enum {Link,Thread} PointerTag;
//Link==0:指针,Thread==1:线索
构造二叉链表
按下列次序输入字符: ABCDEGF (其中表示空格字符) 可建立如右图的二叉链表.
A B
C
D
E
F
G
6.3.2 线索二叉树
遍历是非线性结构的线性化操作 保留遍历过程的顺序信息 ----线索二叉树的表示: 若结点有左子树,则其LCHILD域指示其左孩子, 否则令LCHILD域指示其前驱; 若结点有右子树,则其RCHILD域指示其右孩子, 否则令RCHILD域指示其后继。
if (ch==‘#’) T=NULL; else { if (!(T=(BiTNode *) malloc(sizeof (BiTNode))))
exit(OVERFLOW); T->data = ch ; CreateBiTree(T->lchild); CreateBiTree(T->rchild); } return OK; }//CreateBiTree
if (T){ if (PostOrderTraverse(T->lchild,Visit))
if (PostOrderTraverse(T->rchild,Visit)) if (Visit(T->data)) return OK;
return ERROR; }else return OK; }//PostOrderTraverse
后序遍历二叉树的操作定义为:
若二叉树为空,则空操作;
否则
A
(1)后序遍历左子树;
(2)后序遍历右子树;
B
E
(3)访问根结点。
C
DG
CFDBGEA
F
后序遍历二叉树的递归算法
Status PostOrderTraverse(BiTree T, Status(* Visit)(TElemType e)){
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;