建立线索二叉链表结构,实现二叉树的中序线索化及中序线索二叉树的遍历算法

建立线索二叉链表结构,实现二叉树的中序线索化及中序线索二叉树的遍历算法。

#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");
}




猜你喜欢

转载自blog.csdn.net/qq_40953393/article/details/78935549