线索化二叉树并输出其中序遍历结果。
1. 首先,在线索化二叉树之前,要有一个二叉树所以先序创建二叉树。
2. 将二叉树线索化。
3. 把线索化后的二叉树当做双向链表进行遍历。
代码如下:
#include"stdio.h"
#include"stdlib.h"
#include"conio.h"
#include<iostream>
using namespace std;
typedef enum PointerTag { Link, Thread };
typedef struct BiThrNode
{
int data; //节点的数据域
PointerTag ltag, rtag; //增加的线索标记
struct BiThrNode *lchild; //当ltag=0时lchild代表左节点,ltag=1时代表没有左节点lchild代表的是前驱节点
struct BiThrNode *rchild; //当rtag=0时rchild代表右节点,rtag=1时代表没有右节点rchild代表的是后继节点
} BiThrNode, *BiThrTree; //线索数的节点类型定义
void InThreaing(BiThrTree p);
BiThrTree pre;
void CreatBiThrTree(BiThrTree &T)
{ //创建线索二叉树
int a;
cin >> a;
if (a == 0) T = NULL;
else {
if (!(T = (BiThrTree)malloc(sizeof(BiThrNode)))) printf("储存分配失败了!!\n");
T->data = a;
T->ltag = Link;
T->rtag = Link;
CreatBiThrTree(T->lchild);
CreatBiThrTree(T->rchild);
}
}
void InOrderThreaing(BiThrTree &Thrt, BiThrTree T)
{ //中序遍历二叉树 并使其线索化 Thrt指向头结点
if (!(Thrt = (BiThrTree)malloc(sizeof(BiThrNode)))) printf("空间分配不足!!\n");
Thrt->ltag = Link; Thrt->rtag = Thread;
Thrt->rchild = Thrt;
if (!T) Thrt->lchild = Thrt;
else {
Thrt->lchild = T;
pre = Thrt;
InThreaing(T);
pre->rchild = Thrt;
pre->rtag = Thread;
Thrt->rchild = pre;
}
}
void InThreaing(BiThrTree p)
{ //线索化
if (p->lchild)
InThreaing(p->lchild); //左子树线索化
if (!p->lchild) { p->ltag = Thread; p->lchild = pre; } //前驱线索
if (!pre->rchild) { pre->rtag = Thread; pre->rchild = p; }//后继线索
pre = p; //保持pre指向前驱
if(p->rchild )
InThreaing(p->rchild); //右子树线索化
}
void visit(BiThrTree T)
{
printf("%d ", T->data);
}
void InOrderTraverse_Thr(BiThrTree T)
{
BiThrTree p = T->lchild;
printf("中序遍历结果为:\n");
while (p != T) {
while (p->ltag == Link) p = p->lchild;
visit(p);
if (!p) ;
else {
while (((p->rtag == Thread&&p->rchild != T)||(p->rtag ==Link))&&p->ltag==1)
{
p = p->rchild;
visit(p);
}
p = p->rchild;
}
}
}
int main()
{
BiThrTree T, Thrt;
if (!(pre = (BiThrTree)malloc(sizeof(BiThrNode)))) printf("空间分配不足!!\n");
CreatBiThrTree(T);
InOrderThreaing(Thrt, T);
InOrderTraverse_Thr(Thrt);
char ch = getchar();
ch = getchar();
return 0;
}
我先序建立的二叉树为:1 2 3 0 0 4 0 5 0 0 6 0 0(其中0代表无节点)
我的例子的对应的二叉树图形如下(其中0代表此处无节点):
其运行结果如下: