前言
今天刚花了点时间学了下线索二叉树,想把代码留下来,顺便理清一下自己的思路,于是就有了这篇文章,欢迎各位dalao在评论区批评指正哈~
线索二叉树的定义
想要实现线索二叉树,首先一定要了解其定义。所谓线索二叉树,就是将二叉树中的空链域进行利用,在其中存放其后继或先驱元素的地址。
图片来自于百度百科
线索二叉树的实现
二叉树的线索化
部分代码如下:
void InThreading(BiThrTree p)
{
if(p)//控制递归
{
InThreading(p->lchild);
if(!p->lchild){
p->ltag=1;
p->lchild=pre;
}
if(pre&&!pre->rchild){
pre->rtag=1;
pre->rchild=p;
}
pre=p;
InThreading(p->rchild);
}
return;
}
void PrintThreading(BiThrTree T)
{
BiThrTree p=T;
while(T->lchild) T=T->lchild;
while(T){
if(T->ltag)
printf("#");
else if(T->lchild->lchild==p){
T=T->lchild;
continue;
}
printf("%c",T->data);
if(T->rtag)
printf("#");
p=T;
T=T->rchild;
}
return;
}
输出线索二叉树
部分代码如下:
void PrintThreading(BiThrTree T)
{
BiThrTree p=T;
while(T->lchild) T=T->lchild;
while(T){
if(T->ltag)
printf("#");
else if(T->lchild->lchild==p){
T=T->lchild;
continue;
}
printf("%c",T->data);
if(T->rtag)
printf("#");
p=T;
T=T->rchild;
}
return;
}
完整代码如下:
#include<stdio.h>
#include<stdlib.h>
typedef struct BitThrtNode{
char data;
int ltag,rtag;
struct BitThrtNode *lchild,*rchild;
}BitThrtNode,*BiThrTree;
BiThrTree pre=NULL;
BiThrTree CreateTree()
{
BiThrTree T;
char ch;
scanf("%c",&ch);
if(ch==' ') T=NULL;
else
{
if(!(T=(BitThrtNode*)malloc(sizeof(BitThrtNode)))) exit(-2);
T->data=ch;
T->ltag=0;
T->rtag=0;
T->lchild=CreateTree();
T->rchild=CreateTree();
}
return T;
}
void InThreading(BiThrTree p)
{
if(p)//控制递归
{
InThreading(p->lchild);
if(!p->lchild){
p->ltag=1;
p->lchild=pre;
}
if(pre&&!pre->rchild){
pre->rtag=1;
pre->rchild=p;
}
pre=p;
InThreading(p->rchild);
}
return;
}
void PrintThreading(BiThrTree T)
{
BiThrTree p=T;
while(T->lchild) T=T->lchild;
while(T){
if(T->ltag)
printf("#");
else if(T->lchild->lchild==p){
T=T->lchild;
continue;
}
printf("%c",T->data);
if(T->rtag)
printf("#");
p=T;
T=T->rchild;
}
return;
}
int main()
{
BiThrTree t;
t=CreateTree();
InThreading(t);
pre->rtag=1;
PrintThreading(t);
printf("\n");
return 0;
}
这里输入二叉树是用的是先序输入,空格代表节点为空。我用的Dev c++是可以正常运行的。