目录
存储结构二叉树遍历利用遍历创建二叉树利用遍历对结点操作
线索二叉树线索化线索二叉树遍历
存储结构
typedef enum PointerTag
{ Link
,Thread
};
typedef struct BiTNode
{
ElemType data
;
BiTNode
* lchild
, * rchild
;
PointerTag LTag
, RTag
;
}BiTNode
,*BiTree
;
二叉树遍历
先序遍历中序遍历后序遍历
具体操作与递归左右子树次序的区别
利用遍历创建二叉树
Status
CreatBiTree(BiTree
& L
) {
char ch
;
cin
>> ch
;
if (ch
== '#') L
= NULL;
else {
L
= (BiTree
)malloc(sizeof(BiTNode
));
L
->data
= ch
;
CreatBiTree(L
->lchild
);
CreatBiTree(L
->rchild
);
}
return OK
;
}
利用遍历对结点操作
以输出结点的值为例
Status
PrintBiTree(BiTree L
) {
cout
<< L
->data
;
return OK
;
}
Status
ErgodicBiTree2(BiTree L
, Status
PrintBiTree(BiTree L
)) {
if (L
) {
PrintBiTree(L
);
ErgodicBiTree(L
->lchild
, PrintBiTree
);
ErgodicBiTree(L
->rchild
, PrintBiTree
);
}
return OK
;
}
线索二叉树
在有n个结点的二叉链表中必有n+1个空链域增加两个标志域LTag、RTag.0表示指针,1表示线索结点有左子树,lchild域指向左子树,否则指向其前驱结点有右子树,rchild域指向右子树,否则指向其后继
线索化
仿照线性表存储结构,在线索二叉树链表上添加一个头节点其lchild指向二叉树根结点,rchild指向最后一个结点遍历第一个结点的lchild域和最后一个结点的rchild域均指向头结点
Status
InTreading(BiTree L
) {
if (L
) {
InTreading(L
->lchild
);
if (!L
->lchild
) { L
->LTag
= Thread
;L
->lchild
= pre
; }
else L
->LTag
= Link
;
if (!pre
->rchild
) { pre
->RTag
= Thread
;pre
->rchild
= L
; }
else pre
->RTag
= Link
;
pre
= L
;
InTreading(L
->rchild
);
}
return OK
;
}
Status
InOderTreading(BiTree
& Thrt
, BiTree L
) {
if (!(Thrt
= (BiTree
)malloc(sizeof(BiTNode
)))) return ERROR
;
Thrt
->LTag
= Link
;
Thrt
->RTag
= Thread
;Thrt
->rchild
= Thrt
;
if (!L
) Thrt
->lchild
= Thrt
;
else {
Thrt
->lchild
= L
;pre
= Thrt
;
InTreading(L
);
pre
->RTag
= Thread
;pre
->rchild
= Thrt
;
Thrt
->rchild
= pre
;
}
return OK
;
}
线索二叉树遍历
Status
InOrderTreave(BiTree L
, Status
PrintBiTree(BiTree L
)) {
BiTree p
;
p
= L
->lchild
;
while (p
!= L
) {
while (p
->LTag
== Link
) p
= p
->lchild
;
if (!PrintBiTree(p
)) return ERROR
;
while (p
->RTag
== Thread
&& p
->rchild
!= L
) {
p
= p
->rchild
;PrintBiTree(p
);
}
p
= p
->rchild
;
}
return OK
;
}
完整代码