线索二叉树的实现

前言

今天刚花了点时间学了下线索二叉树,想把代码留下来,顺便理清一下自己的思路,于是就有了这篇文章,欢迎各位dalao在评论区批评指正哈~

线索二叉树的定义

想要实现线索二叉树,首先一定要了解其定义。所谓线索二叉树,就是将二叉树中的空链域进行利用,在其中存放其后继或先驱元素的地址。
图片来自于百度百科
图片来自于百度百科

线索二叉树的实现

二叉树的线索化

部分代码如下:

void InThreading(BiThrTree p)  
{
  if(p)//控制递归
  {
    InThreading(p->lchild);
    if(!p->lchild){
	  p->ltag=1;
	  p->lchild=pre;
	  }
    if(pre&&!pre->rchild){
	  pre->rtag=1;
	  pre->rchild=p;
	  }
    pre=p;
    InThreading(p->rchild);
   }
   return;
}
void PrintThreading(BiThrTree T)
{
  BiThrTree p=T;
  while(T->lchild) T=T->lchild;
  while(T){
  if(T->ltag) 
   printf("#");
  else if(T->lchild->lchild==p){
  	T=T->lchild;
  	continue;
  }
  printf("%c",T->data);
  if(T->rtag) 
   printf("#");
  p=T;
  T=T->rchild;
  }
  return;
}

输出线索二叉树

部分代码如下:

void PrintThreading(BiThrTree T)
{
  BiThrTree p=T;
  while(T->lchild) T=T->lchild;
  while(T){
  if(T->ltag) 
   printf("#");
  else if(T->lchild->lchild==p){
  	T=T->lchild;
  	continue;
  }
  printf("%c",T->data);
  if(T->rtag) 
   printf("#");
  p=T;
  T=T->rchild;
  }
  return;
}

完整代码如下:

#include<stdio.h>
#include<stdlib.h>
typedef struct BitThrtNode{
  char data;
  int ltag,rtag;
  struct BitThrtNode *lchild,*rchild;
}BitThrtNode,*BiThrTree;
BiThrTree pre=NULL;
BiThrTree CreateTree()
{
  BiThrTree T;
  char ch;
  scanf("%c",&ch);
  if(ch==' ') T=NULL;
  else
  {
    if(!(T=(BitThrtNode*)malloc(sizeof(BitThrtNode)))) exit(-2);
    T->data=ch;
    T->ltag=0;
    T->rtag=0;
    T->lchild=CreateTree();
    T->rchild=CreateTree();
  } 
  return T;
}
void InThreading(BiThrTree p)
{
  if(p)//控制递归
  {
    InThreading(p->lchild);
    if(!p->lchild){
	  p->ltag=1;
	  p->lchild=pre;
	  }
    if(pre&&!pre->rchild){
	  pre->rtag=1;
	  pre->rchild=p;
	  }
    pre=p;
    InThreading(p->rchild);
   }
   return;
}
void PrintThreading(BiThrTree T)
{
  BiThrTree p=T;
  while(T->lchild) T=T->lchild;
  while(T){
  if(T->ltag) 
   printf("#");
  else if(T->lchild->lchild==p){
  	T=T->lchild;
  	continue;
  }
  printf("%c",T->data);
  if(T->rtag) 
   printf("#");
  p=T;
  T=T->rchild;
  }
  return;
}
int main()
{
  BiThrTree t;
  t=CreateTree();
  InThreading(t);
  pre->rtag=1;
  PrintThreading(t);
  printf("\n");
  return 0;
}

这里输入二叉树是用的是先序输入,空格代表节点为空。我用的Dev c++是可以正常运行的。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

玄苍非影

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值