线索二叉树

线索二叉树:将指向空链域的左指针指向其前驱,右指针指向其后继。

  • 通过中序遍历对二叉树线索化的递归算法
  • 通过中序遍历建立中序线索化二叉树(含头结点)
  • 中序遍历建立中序线索化二叉树(不含头结点)
  • 中序遍历二叉线索树的非递归算法

#include<stdio.h>
#include<stdlib.h>
typedef struct  ThreadNode{
	char data;
	struct ThreadNode *lchild;
	struct ThreadNode *rchild;
	int ltag,rtag;
}ThreadNode,*ThreadTree;
void CreateBiTree_Thr(ThreadTree &T)
{
	char ch;
	ch=getchar();
	if(ch=='^'){
		T=NULL;
	}else{
		T=(ThreadTree)malloc(sizeof(ThreadTree));
		T->data=ch;
		CreateBiTree_Thr(T->lchild);
		if(T->lchild){
			T->ltag=0;
		}else{
			T->ltag=1;
		}
		CreateBiTree_Thr(T->rchild);
		if(T->rchild){
			T->rtag=0;
		}else{
			T->rtag=1;
		}
	}
}
//通过中序遍历对二叉树线索化的递归算法
void  InThread(ThreadTree &p,ThreadTree &pre){
	if(p!=NULL){
		InThread(p->lchild,pre);
		if(p->lchild==NULL){//左子树为空,建立前驱线索 
			p->lchild=pre;
			p->ltag=1; 
		}
		if(pre!=NULL&&pre->rchild==NULL){
			pre->rchild=p;//建立前驱结点的后继线索
			pre->rtag=1; 
		}
		pre=p;//保持pre指向p的前驱,pre指向刚刚访问过的结点  
		InThread(p->rchild,pre);//递归,线索化右子树 
	}
} 
//中序遍历建立中序线索化二叉树(不含头结点) 
void CreateInThread(ThreadTree &T){
	ThreadTree pre=NULL;
	if(T!=NULL){
		InThread(T,pre);//线索化二叉树 
		pre->rchild=NULL;
		pre->rtag=1;
	} 
} 
//通过中序遍历建立中序线索化二叉树(含头结点) 
void CreateInThread_head(ThreadTree &Thrt,ThreadTree &T){
	//Thrt指向头结点 
	ThreadTree pre=NULL; 
	Thrt=(ThreadTree)malloc(sizeof(ThreadNode));
	Thrt->data='\0';
	Thrt->ltag=0;//建立头结点 
	Thrt->rtag=1;
	Thrt->rchild=Thrt; //右指针回指 
	if(Thrt==NULL){
		Thrt->lchild=Thrt;
	}else{
		Thrt->lchild=T;
		pre=Thrt;
		InThread(T,pre);//线索化二叉树
		pre->rchild=Thrt;//最后一个结点指回头结点 
		pre->rtag=1;
		Thrt->rchild=pre;//头结点指向最后一个结点,建立双向联系 	
	}
} 
//中序遍历二叉线索树的非递归算法
void  InOrder_Thr(ThreadTree Thrt){
	ThreadTree p=Thrt->lchild;//p指向根结点 
	while(p!=Thrt){
		while(p->ltag==0){
			p=p->lchild;
		} 
		printf("%c ",p->data);
		while(p->rtag==1&&p->rchild!=Thrt){
			p=p->rchild;
			printf("%c ",p->data);
		}
		p=p->rchild;
	}
} 
int main(){
	ThreadTree Thrt;
	ThreadTree T,pre=NULL;
	printf("————————————————————————————△创建二叉树\n");
	CreateBiTree_Thr(T);
	printf("————————————————————————————△中序线索化二叉树(含头结点)\n");
	//CreateInThread(T);
	CreateInThread_head(Thrt,T);
	printf("————————————————————————————△中序遍历线索二叉树\n");
	InOrder_Thr(Thrt);
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值