• 中序线索化二叉树


    #include<stdio.h>
    #include<stdlib.h>
    #define OK 1
    #define ERROR 0
    #define OVERFLOW 0
    
    typedef enum PointerTag{Link,Thread};// Link == 0:指针,Thread=1:线索
    typedef char TElemType;//数据类型
    typedef int Status;
    
    typedef struct BiThrNode{
    	
    	TElemType data;
    	BiThrNode *lchild,*rchild;
    	PointerTag LTag,RTag;//左右标点
    
    }BiThrNode,*BiThrTree;
    
    //创建一个全局变量
    BiThrTree pre=NULL;
    
    //二叉树的创建
    void CreateBiTree(BiThrTree &btt)
    {
    	char c;
    	c=getchar();
    	if(c=='#')
    		btt=NULL;
    	else
    	{
    		btt=(BiThrTree)malloc(sizeof(BiThrNode));
    		btt->data=c;
    		btt->LTag=Link;btt->RTag=Link;//为左右标签设置初始值
    		CreateBiTree(btt->lchild);
    		CreateBiTree(btt->rchild);
    	}
    }
    
    
    Status Visit(TElemType e)
    {
    	if(e=='')
    		return ERROR;
    	else
    	{
    		printf("%c",e);
    		return OK;
    	}
    }
    
    void PreOrderTraverse(BiThrTree btt)//递归前序遍历
    {
    	if(btt)
    	{
    		printf("%c",btt->data);
    		PreOrderTraverse(btt->lchild);
    		PreOrderTraverse(btt->rchild);
    	}
    }
    
    void InOrderTraverse(BiThrTree btt)//递归中序遍历
    {
    	if(btt)
    	{
    		InOrderTraverse(btt->lchild);
    		printf("%c",btt->data);
    		InOrderTraverse(btt->rchild);
    	}
    }
    
    void PostOrderTraverse(BiThrTree btt)//递归后续遍历
    {
    	if(btt)
    	{
    		PostOrderTraverse(btt->lchild);
    		PostOrderTraverse(btt->rchild);
    		printf("%c",btt->data);
    	}
    }
    
    void InThreading(BiThrTree p)
    {
    	if(p)
    	{
    		InThreading(p->lchild);//线索化左树
    		if(!p->lchild)//前去线索
    		{
    			p->lchild=pre;
    			p->LTag=Thread;
    		}
    		if(!pre->rchild)//后继结点
    		{
    			pre->rchild=p;
    			pre->RTag=Thread;
    		}
    		pre=p;//保存前驱节点		
    		//注意在线索化最后一个结点时,p=pre,此时p->rchild是为空的,所以递归结束,最后一个结点没有成功被线索化
    		InThreading(p->rchild);//线索化右树
    	}
    }
    
    Status InOrderThreading(BiThrTree &Thrt,BiThrTree T)//中序线索化二叉树
    {
    	Thrt=(BiThrTree)malloc(sizeof(BiThrNode));//创建头结点
    	if(!Thrt)return ERROR;
    	Thrt->RTag=Thread;
    	Thrt->rchild=Thrt;
    	Thrt->LTag=Link;
    	if(!T)Thrt->lchild=Thrt;//左结点为空便指向自己
    	else
    	{
    		Thrt->lchild=T;
    		Thrt->LTag=Link;
    		pre=Thrt;//保存上一节点
    		InThreading(Thrt->lchild);
    		pre->rchild=Thrt;//最后一个结点线索化
    		Thrt->RTag=Thread;
    		Thrt->rchild=pre;
    	}
    	return OK;
    }
    
    Status InOrderTraverse_Thr(BiThrTree T,Status(Visit)(TElemType e))
    {
    	BiThrTree p=T->lchild;
    	while(p!=T)//当二叉树为空或者便利完成时,p=T
    	{
    		//由于中序遍历,首节点的左孩子是空的
    		while(p->LTag==Link)//找到左孩子
    			p=p->lchild;
    		if(!Visit(p->data))return ERROR;
    		while(p->RTag==Thread&&p!=T)//右孩子为空
    		{
    			p=p->rchild;//访问后继结点
    			Visit(p->data);
    		}
    		p=p->rchild;
    	}
    	return OK;
    }//InOrderTraverse_Thr
    
    int main()
    {
    	BiThrTree Thrt,T;
    	CreateBiTree(T);
    	InOrderThreading(Thrt,T);
    	InOrderTraverse_Thr(Thrt,Visit);
    	printf("
    ");
    
    	return 0;
    }

    
        
            

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    python排序函数sort()与sorted()区别
    python中lambda的用法
    Python中如何获取类属性的列表
    百度编辑器UEditor源码模式下过滤div/style等html标签
    【Flask】关于Flask的request属性
    python json.dumps() json.dump()的区别
    SQLAlchemy技术文档(中文版)(全)
    Flask中'endpoint'(端点)的理解
    SqlAlchemy个人学习笔记完整汇总-转载
    MySQL数据类型和常用字段属性总结
  • 原文地址:https://www.cnblogs.com/gaot/p/4833828.html
Copyright © 2020-2023  润新知