#include<stdio.h>
#include<stdlib.h>
typedef enum {Link,Thread} PointerTag;//Link==0表示指向左右孩子的指针
//Thread==1表示指向前驱和后继的线索
typedef struct BiThrNode
{
char date;
struct BiThrNode *lchild,*rchild; //左右孩子指针
PointerTag LTag;
PointerTag RTag; //左右标志
}BiThrNode,*BiThrTree;
BiThrTree pre;
//利用先序序列建立一颗二叉树,'.'代表空树
//测试用例1:abc..de.g..f...#
//测试用例2:-+a..*b..-c..d../e..f..#
void createBiTreeByPreOrder(BiThrTree T)
{
//按先序次序输入二叉树中节点的值(一个字符),点号字符表示空树,构造二叉链表表示的二叉树
//注意:若输入的字符数(不含#号)为n个,则相应的空树即点号就应该有n+1个
char ch;
scanf("%c", &ch);
if(ch != '#')
{
if(ch == '.')
{
T = NULL;
}
else
{
T = (BiThrTree )malloc(sizeof(BiThrNode));
T->date = ch;
createBiTreeByPreOrder(T->lchild);
createBiTreeByPreOrder(T->rchild);
}
}
}
//中序遍历对二叉树进行线索化
void InThreading(BiThrTree p)
{
if(p)
{
InThreading(p->lchild);
if(!p->lchild) //没有左孩子
{
p->LTag = Thread; //左孩子指针指向前驱
p->lchild = pre;
}
if(!pre->rchild) //后继线索
{
pre->LTag=Thread; //前驱右孩子指针指向后继
pre->rchild=p;
}
pre=p;
InThreading(p->lchild);
}
}
//T指向头结点,头结点的lchild指向根节点,头结点的rchild指向中序遍历的最后一个节点
//中序遍历线索二叉树表示二叉树T
int InOrderTraverse(BiThrTree T)
{
BiThrTree p;
p= T->lchild;
while(p != T)
{
while(p->LTag==Link)
p=p->lchild;
printf("%d ",p->date); //当LTag==0时循环到中序序列的第一个节点并显示节点数据
while(p->RTag==Thread&&p->rchild != T)
{
p=p->rchild;
printf("%d ",p->date);
}
p=p->rchild;
}
return 0;
}
int main()
{
BiThrTree T,head;
createBiTreeByPreOrder(T);
// InOrderTraverse(T);
return 0;
}
线索二叉树
最新推荐文章于 2020-03-04 17:11:03 发布