线索化二叉树

编译环境:VC++6.0

 

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#define ERROR 0
#define OK  1

typedef char ElemType;

typedef enum PointerTag{Link,Thread};  /* Link==0: 指针 Thread==1: 线索 */

/* 二叉树结构体 */
typedef struct _ThrBiTreeNode    /* 线索二叉树结构体 */
{
 ElemType    data;
 struct _ThrBiTreeNode *lchild,*rchild;
 PointerTag    LTag,RTag;
}ThrBiTree;

int CreateThrBiTree(ThrBiTree **T)  /* 建立二叉树 */
{
 char ch;
 scanf("%c",&ch);
 getchar();
 if(ch == '#')
  *T = NULL;
 else
 {
  assert((*T) = (ThrBiTree*)malloc(sizeof(ThrBiTree)));
  (*T)->data = ch;
  (*T)->LTag = Link;
  (*T)->RTag = Link;
  (*T)->lchild = NULL;
  (*T)->rchild = NULL;
  CreateThrBiTree(&(*T)->lchild);
  CreateThrBiTree(&(*T)->rchild);
 }
 return OK;
}

int Threading(ThrBiTree **pre, ThrBiTree *p) /* 线索化操作 */
{
 if(p)
 {
  Threading(pre,p->lchild);
  if(!p->lchild)    /* 指向前驱 */
  {
   p->LTag = Thread;
   p->lchild = *pre;
  }
  if(!(*pre)->rchild)   /* 指向后继 */
  {
   (*pre)->RTag = Thread;
   (*pre)->rchild = p;
  }
  *pre = p;
  Threading(pre,p->rchild);
 }
 return OK;
}

int inorder_thread(ThrBiTree **Thrt,ThrBiTree *p)
{
 ThrBiTree *pre;
 assert(*Thrt = (ThrBiTree*)malloc(sizeof(ThrBiTree)));
 (*Thrt)->LTag = Link;
 (*Thrt)->RTag = Thread;
 (*Thrt)->rchild = *Thrt;  /* 右指针回指头结点 */
 if(!p)
 {
  (*Thrt)->lchild = *Thrt; /*如果二叉树为空,则做指针回指头结点*/
 }
 else
 {
  pre = *Thrt;
  (*Thrt)->lchild = p; /* 指向树的第一个结点 */
  Threading(&pre,p);  /* 线索化 */

  /* 处理最后一个结点 */
  pre->RTag = Thread;
  pre->rchild = *Thrt;
  (*Thrt)->rchild = pre;
 }
 return OK;
}

int print_ThrBiTree(ThrBiTree *T) /* 中序打印线索二叉树 */
{
 ThrBiTree *p;
 p = T->lchild;
 while(p != T)
 {
  while(p->LTag == Link)
  {
   p = p->lchild;
  }
  printf("%c",p->data);
  while(p->RTag == Thread && p->rchild != T)
  {
   p = p->rchild;
   printf("%c",p->data);
  }
  p = p->rchild;
 }

 return OK;
}

void main(void)
{
 ThrBiTree *T,*Thrt;
 CreateThrBiTree(&T);
 inorder_thread(&Thrt,T);
 print_ThrBiTree(Thrt);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值