利用中序遍历可以解决二叉树中空出来的内存,以及前驱后继的问题。
|------------|----------|----------|----------|------------|
| lchild | ltag | data | rtag | rchild |
------ltag为0时指向该结点的左孩子,为1时指向该结点的前驱。
------rtag为0时指向该结点的有孩子,为1时指向该结点的后继。
cpp
#include <stdio.h>
#include <stdlib.h>
typedef char ElemType;
//线索存储标志
//Link(0):表示指向左右孩子的指针
//thread(1):表示指向前驱后继的线索
typedef enum{Link,Thread} Pointertag;
typedef struct Bithrnode
{
char data;
struct Bithrnode * lchild ,* rchild;
Pointertag ltag;
Pointertag rtag;
}Bithrnode,*Bithrtree;
//创建一棵二叉树,约定用户遵照前序遍历的方式输入数据
Bithrtree pre;
CreateBithree(Bithrtree *t)
{
char c;
scanf("%c",&c);
if(' '== c)
{
*t = NULL;
}
else
{
*t = (Bithrnode*)malloc(sizeof(Bithrnode));
(*t)->data=c;
(*t)->ltag = Link;
(*t)->rtag = Link;
CreateBithree(&(*t)->lchild);
CreateBithree(&(*t)->rchild);
}
}
//中序遍历
Inthreading(Bithrtree t)
{
if(t)
{
Inthreading(t->lchild);//递归左孩子线索化
if(!t->lchild)
{
t->ltag = Thread;
t->lchild = pre;
}
if(!pre->rchild)
{
pre->rtag = Thread;
pre->rchild = t;
}
pre = t;
Inthreading(t->rchild);//递归右孩子线索化
}
}
//中序遍历二叉树,非递归
Inordertraverse(Bithrtree t)
{
Bithrtree p;
p = t->lchild;
while(p!= t)
{
while(p->ltag == Link)
{
p=p->lchild;
}
visit(p->data);
while(p->rtag == Thread && p->rchild != t)
{
p=p->rchild;
visit(p->data);
}
p=p->rchild;
}
}
int main()
{
Bithrtree p,t =NULL;
CreateBithree(&t);
Inthreading(t);
printf("中序遍历输出结果为:");
Inordertraverse(p);
printf("\n");
return 0;
}