代码如下:
#include<stdio.h>
#include<string.h>
#include<malloc.h>
#define ElemType char//定义ElemType为char类型
typedef struct BiThrNode//定义结构体,有五个区域
{
ElemType data;
struct BiThrNode* lchild, * rchild;
int ltag; //左标记,"ltag=0"表示当前节点有左孩子,"ltag=1"表示当前节点没有左孩子
int rtag; //右标记,"rtag=0"表示当前节点有右孩子,"rtag=1"表示当前节点没有右孩子
} BiThrNode, * BiThrTree;
void CreateBiTree(BiThrTree& T)
{
ElemType a;
scanf("%c", &a);
if (a == '#')
T = NULL;
else
{
T = (BiThrTree)malloc(sizeof(BiThrNode));
T->data = a;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}
void InThread(BiThrTree& p, BiThrTree& pre)//线索化
{
if (p != NULL)
{
InThread(p->lchild, pre); //递归,线索化左子树
if (p->lchild == NULL) // 左子树为空,建立前驱线索
{
p->lchild = pre;//pre成为p的前驱
p->ltag = 1;//ltag设为1,说明无左孩子,直接连到前驱
}
if (pre != NULL && pre->rchild == NULL)
{
pre->rchild = p; //建立前驱结点的后继线索
pre->rtag = 1;
}
pre = p; //标记当前结点成为刚刚访问过的结点
InThread(p->rchild, pre); //递归,线索化右子树
}
}
void CreateInThread(BiThrTree T)//创建线索化,调用线索化函数
{
BiThrTree pre = NULL;
if (T != NULL) //非空二叉树,进行线索化
{
InThread(T, pre); //线索化二叉树
pre->rchild = NULL; //处理遍历的最后一个节点
pre->rtag = 1;
}
}
BiThrNode* Firstnode(BiThrNode* p)//返回最左下结点
{
while (p->ltag == 0) p = p->lchild; //最左下结点(不一定是叶结点)
return p;
}
BiThrNode* Nextnode(BiThrNode* p)// 返回后继线索
{//右子树中最左下结点
if (p->rtag == 0) return Firstnode(p->rchild);
else
return p->rchild; //rtag==1,直接返回后继线索
}
BiThrNode *Lastnode(BiThrNode *p){//循环找到最右下结点
while(p->rtag==0)
p=p->rchild;
return p;
}
BiThrNode *Prenode(BiThrNode *p){
//左子树最右下结点
if(p->ltag==0)
return Lastnode(p->lchild);
else
return p->lchild;//ltag==1直接返回前驱线索
}
void InOrder(BiThrTree T)//中序遍历
{
for (BiThrNode* p = Firstnode(T); p != NULL; p = Nextnode(p))
printf("%c ", p->data);//visit(p);
}
int main()
{
BiThrTree T = NULL;
//通过输入建立普通的二叉树
printf("请按先序序列输入各个结点(#表示空结点):");
CreateBiTree(T);//创建二叉树
//中序线索化二叉树
CreateInThread(T);
printf("\n中序线索化完成!\n");
printf("中序遍历结果为:");
InOrder(T);//中序遍历
}
935

被折叠的 条评论
为什么被折叠?



