#include <stdio.h>
#include <stdlib.h>
#include<string.h>
typedef char ElemType;
// 线索存储标志位
// Link(0):表示指向左右孩子的指针
// Thread(1):表示指向前驱后继的线索
typedef enum {Link, Thread} PointerTag;//定义枚举类型
typedef struct BiThrNode
{
char data;
struct BiThrNode *lchild, *rchild;
PointerTag ltag;//标志左孩子(0)//标志前驱(1)
PointerTag rtag;//标志右孩子(0)//标志后继(1)
} BiThrNode, *BiThrTree;
// 全局变量,始终指向刚刚访问过的结点
BiThrTree pre;
// 创建一棵二叉树,约定用户遵照前序遍历的方式输入数据
void CreateBiThrTree( 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;
CreateBiThrTree(&(*T)->lchild);
CreateBiThrTree(&(*T)->rchild);
}
}
// 中序遍历线索化
void InThreading(BiThrTree T)
{
if( T )
{
InThreading( T->lchild ); // 递归左孩子线索化
//结点处理,指向前驱后继
if( !T->lchild ) // 如果该结点没有左孩子,设置ltag为Thread,并把lchild指向刚刚访问的结点。
{
T->ltag = Thread;
T->lchild = pre;//指向前驱
}
if( !pre->rchild )//指向后继,pre是刚刚访问过的点,只有访问过才知道有没有后继 很明显pre是T的前驱,那T是pre的后继
{
pre->rtag = Thread;
pre->rchild = T;
}
pre = T;
InThreading( T->rchild ); // 递归右孩子线索化
}
}
void InOrderThreading( BiThrTree *p, BiThrTree T )
{
//初始化一个头结点
*p = (BiThrTree)malloc(sizeof(BiThrNode));
(*p)->ltag = Link;
(*p)->rtag = Thread;
(*p)->rchild = *p;//右边是空树,指向自己
if( !T )
{
(*p)->lchild = *p;
}
else
{
(*p)->lchild = T;
pre = *p;//给pre赋值
InThreading(T);
pre->rchild = *p;// pre此时已经在最后一个结点了 做收尾工作
pre->rtag = Thread;
(*p)->rchild = pre;
}
}
void visit( char c )
{
printf("%c", c);
}
// 中序遍历二叉树,非递归
void InOrderTraverse( BiThrTree T )
{
BiThrTree p;
p = T->lchild;
while( p != T )
{
while( p->ltag == Link )//有左孩子
{
p = p->lchild;//一直走 走到p没有左孩子 为了是走到最左边
}
visit(p->data);
while( p->rtag == Thread && p->rchild != T )//p没有右孩子 知道最后一个元素 p->rchild!=T表示p不是最后一个元素
{
p = p->rchild;//p指向它的后继
visit(p->data);
}
p = p->rchild;//收尾工作 p指回 头结点
}
}
int main()
{
BiThrTree P, T = NULL;
CreateBiThrTree( &T );
InOrderThreading( &P, T );
printf("the result of the InorderThreading:");
InOrderTraverse( P );
printf("\n");
return 0;
}
线索二叉树的实现
最新推荐文章于 2022-03-04 10:33:50 发布