建立线索二叉链表结构,实现二叉树的中序线索化及中序线索二叉树的遍历算法。
#include<stdlib.h>
#include<stdio.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -1
typedef int Status;
typedef char ElemType;
typedef enum PointerTag {Link, Thread};//Link=0:指针;Thread=1:线索
//带线索的二叉树链表结构
typedef struct BiTNode{
ElemType data;
struct BiTNode *lchild,*rchild; //左右指针
PointerTag LTag, RTag; //左右标志
}BiTNode,*BiTree;
//打印元素
Status PrintElement(BiTree T);
//1-创建二叉树
//按先序次序输入二叉树中结点的值(一个字符),空格表示空树
Status CreateBiTree(BiTree &T);
//2中序遍历二叉树,并将其中序线索化
Status InOrderThreading_Head(BiTree &Thrt, BiTree T);
//3线索化二叉树
void InThreading(BiTree p,BiTree &pre);
//4中序遍历二叉线索树(非递归)
Status InOrderTraverse_Thr(BiTree T);
//打印元素
Status PrintElement(ElemType e)
{
printf("%c",e);
return OK;
}
//1-创建二叉树
// 按先序次序输入二叉树中结点的值(一个字符),空格字符表示空树,
Status CreateBiTree(BiTree &T)
{
ElemType ch;
ch=getchar();
if (ch==' ') T = NULL;
else
{
if(!(T=(BiTNode *)malloc(sizeof(BiTNode)))) exit(OVERFLOW);
T->data = ch; // 生成根结点
T->LTag = Link;
T->RTag = Link;
CreateBiTree(T->lchild); // 构造左子树
CreateBiTree(T->rchild); // 构造右子树
}
return OK;
} // CreateBiTree
//2中序遍历二叉树,并将其中序线索化
Status InOrderThreading_Head(BiTree &Thrt, BiTree T)
{
BiTree pre;
if (!(Thrt = (BiTree)malloc(sizeof(BiTNode)))) exit(OVERFLOW);
Thrt->LTag = Link; Thrt->RTag =Thread; // 建头结点
Thrt->rchild = Thrt; // 右指针回指
if (!T) Thrt->lchild = Thrt; // 若二叉树空,则左指针回指
else {
Thrt->lchild = T; pre = Thrt;
InThreading(T,pre); // 算法6.7
pre->rchild = Thrt; pre->RTag = Thread; // 最后一个结点线索化
Thrt->rchild = pre;
}
return OK;
} // InOrderThreading
//3线索化二叉树
//线索二叉树
void InThreading(BiTree p, BiTree &pre)
{
if(p){
InThreading(p->lchild, pre);
if(!p->lchild){p->LTag = Thread;p->lchild = pre;}
if(!pre->rchild){pre->RTag = Thread;pre->rchild = p;}
pre = p;
InThreading(p->rchild, pre);
}
}
//4中序遍历二叉线索树(非递归)
Status InOrderTraverse_Thr(BiTree T)
{
BiTree p = T->lchild;
while(p != T)
{
while(p->LTag == Link)
p = p->lchild;
PrintElement(p->data);
while(p->RTag == Thread && p->rchild!= T){
p = p->rchild;
PrintElement(p->data);
}
p = p->rchild;
}
return OK;
}
void main()
{
BiTree T,Thrt;
printf("按先序次序输入二叉树中结点的值(一个字符),空格字符表示空树:\n");
CreateBiTree(T);
InOrderThreading_Head(Thrt,T);
printf("\n中序线索遍历二叉树:");
InOrderTraverse_Thr(Thrt);
printf("\n");
}