线索二叉树

代码如下:

#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);//中序遍历

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

七月初七淮水竹亭~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值