您的位置:首页 > 理论基础 > 数据结构算法

数据结构之线索二叉树

2019-02-22 19:41 85 查看
/*
线索二叉树
*/
#include<stdio.h>
#include<stdlib.h>

//线索存储标志位
//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;

//创建一颗二叉树,约定用户遵照前序遍历的方式输入数据
void createBiThrTree(BiThrTree *);

//中序遍历线索化
void InThreading(BiThrTree);

void InorderThreading(BiThrTree *,BiThrTree);

void main()
{
BiThrTree P,T=NULL;
createBiThrTree(&T);
InorderThreading(&P,T);
}

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)//前驱线索
{
T->ltag=Thread;
T->lchild=pre;
}

if(!pre->rchild)
{
pre->rtag=Thread;
pre->rtag=T;
}

pre=T;

InThreading(T->rchild);
}
}

void InorderThreading(BiThrTree *p,BiThrTree T)
{
*p=(BiThrNode *)malloc(sizeof(BiThrNode));
(*p)->ltag=Link;
(*p)->rtag=Thread;
(*p)->rchild=*p;
if(!T)
{
(*p)->lchild=*p;
}else{
(*p)->lchild=T;
pre=*p;
InThreading(T);
pre->rchild=*p;
pre->rtag=Thread;
(*p)->rchild=pre;
}
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: