实现中序线索化二叉树

/*exp7-5.cpp*/
#include<stdio.h>
#include<malloc.h>
#define MaxSize 100
typedef char ElemType;
typedef struct node
{
 ElemType data;
 int ltag,rtag;/*增加的线索标记*/
 struct node *lchild;
 struct node *rchild;
}TBTNode;

void CreateTBTNode(TBTNode * &b,char *str)/*由str串建立含空线索域的二叉链*/
{
 TBTNode *St[MaxSize],*p=NULL;
 int top=-1,k,j=0;
 char ch;
 b=NULL;
 ch=str[j];/*建立二叉树初始时为空*/
 while(ch!='\0')/*str未扫描完时循环*/
 {
  switch(ch)
  {
  case '(':top++;St[top]=p;k=1;break;/*为左结点*/
  case ')':top--;break;
  case ',':k=2;break;/*为右结点*/
  default:p=(TBTNode *)malloc(sizeof(TBTNode));
   p->data=ch;p->lchild=p->rchild=NULL;
   if(b==NULL)  /**p为二叉树的根结点*/
    b=p;
   else /*已建立二叉树根结点*/
   {
    switch(k)
    {
    case 1:St[top]->lchild=p;break;
    case 2:St[top]->rchild=p;break;
    }
   }
  }
  j++;
  ch=str[j];
 }
}

void DispTBTNode(TBTNode * b)/*输出含空线索域外的二叉树*/
{
 if(b!=NULL)
 {
  printf("%c",b->data);
  if(b->lchild!=NULL || b->rchild!=NULL)
  {
   printf("(");
   DispTBTNode(b->lchild);
   if(b->rchild!=NULL) printf(",");
   DispTBTNode(b->rchild);
   printf(")");
  }
 }
}

TBTNode *pre;/*全局变量*/
void Thread(TBTNode * &p)/*由CreaThread()调用*/
{
 if(p!=NULL)
 {
  Thread(p->lchild);/*左子树线索化*/
  if(p->lchild==NULL)/*前驱线索*/
  {
   p->lchild=pre;/*前驱线索*/
   p->ltag=1;/*建立当前结点的前驱线索*/
  }
  else
   p->ltag=0;
  if(pre->rchild==NULL)/*后继线索*/
  {
   pre->rchild=p;/*建立前驱结点的后继线索*/
   pre->rtag=1;
  }
  else
   pre->rtag=0;
  pre=p;
  Thread(p->rchild);/*右子树线索化*/
 }
}

TBTNode *CreaThread(TBTNode *b)/*中序线索化二叉树*/
{
 TBTNode *root;
 root=(TBTNode *)malloc(sizeof(TBTNode));/*创建根结点*/
 root->ltag=0;root->rtag=1;
    root->rchild=b;
 if(b==NULL)
  root->lchild=root;/*空二叉树*/
 else
 {
  root->lchild=b;
  pre=root;/*pre是*p的前驱结点,供加线索用*/
  Thread(b);/*中序遍历线索二叉树*/
  pre->rchild=root;/*最后处理,加入指向根结点的线索*/
  pre->rtag=1;
  root->rchild=pre;/*根结点右线索化*/
 }
 return root;

void ThInOrder(TBTNode *tb)/*中序线索化二叉树中实现中序遍历*/
{
 TBTNode *p=tb->lchild;/*指向根结点*/
 while(p!=tb)
 {
  while(p->ltag==0) p=p->lchild;
  printf("%c",p->data);
  while(p->rtag==1 && p->rchild!=tb)
  {
   p=p->rchild;
   printf("%c",p->data);
  }
  p=p->rchild;
 }
}

void main()
{
 TBTNode *b,*tb;
 CreateTBTNode(b,"A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))");
 printf("二叉树:");DispTBTNode(b);printf("\n");
 tb=CreaThread(b);
 printf("线索中序序列:");
 ThInOrder(tb);
 printf("\n");
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值