博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bithrtree
阅读量:6939 次
发布时间:2019-06-27

本文共 3943 字,大约阅读时间需要 13 分钟。

#include "stdio.h"#include "stdlib.h"#define OK 1#define ERROR 0typedef char TElemType;typedef char Elemtype;typedef int Status;typedef enum PointerTag {Link,Thread}; //link==0:pointer,Thread==1:threadtypedef struct BiThrNode{	TElemType data;	struct BiThrNode *lchild,*rchild;	PointerTag LTag,RTag;}BiThrNode,*BiThrTree;BiThrTree pre; // 全局变量,始终指向刚刚访问过的结点void InThreading(BiThrTree p){	if(p)	  {	   InThreading(p->lchild);//左子树线索化	   if(!p->lchild){p->LTag=Thread;p->lchild=pre;}//前驱线索	   if(!pre->rchild){pre->RTag=Thread;pre->rchild=p;}//后续线索	   pre=p; //保持pre指向p的前驱	   InThreading(p->rchild);//右子树线索化	  }//if}//InThreadingStatus InOrderThreading(BiThrTree &Thrt,BiThrTree T){//中序遍历二叉树,并将其中序线索化,Thrt指向头结点//BiThrTree Thrt;	if(!(Thrt=(BiThrTree)malloc(sizeof(BiThrNode)))) exit(-1);	Thrt->LTag=Link; //建立头结点	Thrt->RTag=Thread; //右指针回指	Thrt->rchild=Thrt; 	if(!T) Thrt->rchild=Thrt; //若二叉树为空,则左指针回指	else {	     Thrt->lchild=T;	     pre=Thrt;	     InThreading(T);  //中序遍历进行中序线索化	     pre->rchild=Thrt;//最后一个结点线索化	     pre->RTag=Thread;	     Thrt->rchild=pre;	    }return OK;}//InOrderThreadingStatus InOrderTraverse_Thr(BiThrTree T){//T指向头结点,头结点的左链lchild指向根结点,非递归算法	BiThrTree p; 	p=T->lchild;	while(p!=T) //空树或遍历结束时,T==p	 {		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); //访问后续结点          }//while	   p=p->rchild;	}//while	printf("\n");	return OK;}//InOrderT_ThrBiThrTree InOrderSearch_Thr(BiThrTree T,Elemtype ch){//T指向头结点,头结点的左链lchild指向根结点,非递归算法,查找指定字符ch,找到返回,未找到返回NULL	BiThrTree p; 	p=T->lchild;	while(p!=T) //空树或遍历结束时,T==p	 {		while(p->LTag==Link) p=p->lchild;		if(p->data==ch) return p; //找到,返回该结点指针		while(p->RTag==Thread&&p->rchild!=T)          {	          p=p->rchild;              if(p->data==ch) return p; //找到,返回该结点指针          }//while	   p=p->rchild;	}//while    return NULL;}//InOrderT_ThrStatus CreateBitree(BiThrTree &T){//按先序次序输入二叉树	char ch;	scanf("%c",&ch);	if(ch==' ') T=NULL;	else{			if(!(T=(BiThrTree)malloc(sizeof(BiThrNode)))) exit(1);			T->data=ch;T->LTag=Link;T->RTag=Link;			CreateBitree(T->lchild);			CreateBitree(T->rchild);		}//else	return OK;}//CreateBitreeStatus printelemt(Elemtype e){	printf("%c",e);	return OK;}Status preordertraverse(BiThrTree t,Status (*visit)(Elemtype e)){	if(t)	{		if(visit(t->data))			if(preordertraverse(t->lchild,visit))					if(preordertraverse(t->rchild,visit))  return OK;		return ERROR;	}	else 		return OK;}Status inordertraverse(BiThrTree t,Status (*visit)(Elemtype e)){	if(t)	{	    if(inordertraverse(t->lchild,visit))		    if(visit(t->data))				if(inordertraverse(t->rchild,visit))  return OK;		return ERROR;	}	else 		return OK;}Status postordertraverse(BiThrTree t,Status (*visit)(Elemtype e)){	if(t)	{	    if(postordertraverse(t->lchild,visit))			if(postordertraverse(t->rchild,visit))  						if(visit(t->data)) return OK;		return ERROR;	}	else 		return OK;}BiThrTree InNext(BiThrTree p) /*在中序线索二叉树中查找p的中序后继结点,并用next指针返回结果*/{ 	BiThrTree Next;	BiThrTree q;	if (p->RTag==1)  		 Next = p->rchild; 	else	{ 		if(p->rchild!=NULL)		{			for(q=p->rchild; q->LTag==0 ;q=q->lchild);			Next=q; 		}		else			Next = NULL;	} 	return(Next);}BiThrTree InPre(BiThrTree p)/* 在中序线索二叉树中查找p的中序前驱, 并用pre指针返回结果 */{  	BiThrTree q;	if(p->LTag==1)		pre = p->lchild; 	else 	{ 		for(q = p->lchild;q->RTag==0;q=q->rchild);		pre=q;	} return(pre);}int main(){	char ch;	BiThrTree T,Thrt,p,q;	CreateBitree(T);//创建	preordertraverse(T,printelemt);	printf("\n");	inordertraverse(T,printelemt);	printf("\n");	postordertraverse(T,printelemt);	printf("\n");	InOrderThreading(Thrt,T);//线索化	printf("中序遍历该线索二叉树得到的序列为:\n"); 	InOrderTraverse_Thr(Thrt);//遍历访问    getchar();    printf("请输入树中的一个字符");    scanf("%c",&ch);	p=InOrderSearch_Thr(T,ch);	q=InNext(p);	printf("后继结点:%c\n",q->data);	q=InPre(p);	printf("先趋结点:%c\n",q->data);	return OK;}

 

转载于:https://www.cnblogs.com/wc1903036673/p/3464997.html

你可能感兴趣的文章
CentOS 7安装部署ELK 6.2.4
查看>>
通过ansible批量安装部署mysql
查看>>
Kafka/Metaq设计思想学习笔记
查看>>
Voice Lab 8-SIP笔记
查看>>
如何在 block 中修改外部变量
查看>>
fedora update to 23
查看>>
linux的运行级别及相应含义
查看>>
阿里的分布式持续集成系统-reliable
查看>>
【转】单日峰值2T发送量邮件营销平台实践经验
查看>>
Dell Compellent的一些缺陷
查看>>
我的友情链接
查看>>
分布式消息系统 Kafka 简介
查看>>
内部控制
查看>>
iOS地图选址
查看>>
我的友情链接
查看>>
自动监控linux服务器负载并重启Web服务的脚本
查看>>
四、Windows Server 2012R2 Hyper-v虚拟交换机的创建与管理
查看>>
java 运算顺序
查看>>
天涯LVS部署
查看>>
eclipse不能自动编译工程的解决方法
查看>>