数据结构-线索二叉树的建立和求前驱后驱

不带头结点版

#include<stdio.h>
#include<malloc.h>

typedef char ElemType;
typedef struct BTree{
	ElemType key;
	struct BTree *lchild,*rchild;
	int ltag,rtag;
}BTree;

BTree* CreateBTree()
{
	BTree *p = NULL;
	ElemType ch;
	ch = getchar();
	if(ch!='#'){
		p = (BTree*)malloc(sizeof(BTree));
		p->key = ch;
		p->ltag = 0;
		p->rtag = 0;
		p->lchild = CreateBTree();
		p->rchild = CreateBTree();
	}
	return p;
}

void InOrderThreaeding(BTree *bt)
{
	static BTree *pre = NULL;
	if(bt){
		InOrderThreaeding(bt->lchild);
		if(!bt->lchild){
			bt->ltag = 1;
			bt->lchild = pre;
		}
		if(pre&&!pre->rchild){
			pre->rtag = 1;
			pre->rchild = bt;
		}
		pre = bt;
		InOrderThreaeding(bt->rchild);
	}
}

BTree* Prior(BTree *bt)
{
	BTree *tmp;
	if(!bt)
		tmp = NULL;
	if(bt->ltag == 1)
		tmp = bt->lchild;
	else{
		bt = bt->lchild;
		while(bt->rchild){
			bt = bt->rchild;
		}
		tmp = bt;
	}
	return tmp;
}

BTree* FirstNode(BTree *bt)
{
	if(!bt)
		return NULL;
	while(bt->ltag == 0)
		bt = bt->lchild;
	return bt;
} 

BTree* Next(BTree *bt)
{
	if(bt->rtag == 1)
		return bt->rchild;
	else{
		return FirstNode(bt->rchild);
	}
}


void InOrderThreadingTraverse(BTree *bt)
{
	bt = FirstNode(bt);
	while(bt){
		printf("%c ",bt->key);
		bt = Next(bt);
	}
}

int main()
{
	BTree *bt;
	bt = CreateBTree();
	InOrderThreaeding(bt);
	InOrderThreadingTraverse(bt);
	return 0;
} 

带头结点版

#include<stdio.h>
#include<malloc.h>
 
typedef char ElemType;
typedef struct BTree{
	ElemType key;
	struct BTree *lchild,*rchild;
	int ltag,rtag;
}BTree;
 
BTree* CreateBTree()
{
	BTree *p = NULL;
	ElemType ch;
	ch = getchar();
	if(ch!='#'){
		p = (BTree*)malloc(sizeof(BTree));
		p->key = ch;
		p->ltag = 0;
		p->rtag = 0;
		p->lchild = CreateBTree();
		p->rchild = CreateBTree();
	}
	return p;
}
BTree* pre;

void InThreading(BTree *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);
	}
}

BTree* InOrderThreading(BTree *bt)
{
	BTree *Head;
	Head = (BTree*)malloc(sizeof(BTree));
	if(!Head){
		printf("分配失败.\n");
		return NULL;
	}
	Head->ltag = 0;
	Head->rtag = 1;
	Head->rchild = Head;
	if(bt == NULL){
		Head->lchild = Head;
	}
	else{
		Head->lchild = bt;
		InThreading(bt);
		Head->rchild = pre;
		pre->rtag = 1;
		pre->rchild = Head;
	}
	return Head;
}
 
 
void InOrderThreadingTraverse(BTree *Head)
{
	BTree *tmp;
	tmp = Head->lchild;
	while(tmp != Head){
		while(tmp->ltag == 0){
			tmp = tmp->lchild;
		}
		printf("%c ",tmp->key);
		while(tmp->rtag == 1 && tmp->rchild != Head){
			tmp = tmp->rchild;
			printf("%c ",tmp->key);
		}
		tmp = tmp->rchild;
	}
} 
int main()
{
	BTree *bt;
	bt = CreateBTree();
	bt = InOrderThreading(bt);
	InOrderThreadingTraverse(bt);
	return 0;
} 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

是洋洋a

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

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

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

打赏作者

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

抵扣说明:

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

余额充值