二叉树的构建,线索化,以及线索二叉树的遍历c++语言表示(《数据结构》算法6.5,6.6,6.7)

下面是用c++代码实现的课本算法。有详细注释。

#include<cstdio>  
#include<cstdlib>  
#include<iostream>  
using namespace std;  
typedef enum PointerTag{Link,Thread};//枚举指针和线索 
typedef struct BiThrNode{  
    int data;  
    struct BiThrNode *lchild,*rchild;   
    PointerTag LTag,RTag; 
}*BiThrTree,BiThrNode;  
BiThrTree pre; //指向按照某种顺序遍历过程中当前结点的前一个结点 
void CreateBiThrTree(BiThrTree &T){//递归方式先序建立二叉树   
    int data2;  
    cin>>data2;  
    if(data2==0){//到叶子结点时,输入两个0,代表叶子下面无左孩子,无右孩子   
        T=NULL;  
        return ;  
    }  
    else{  
        T=(BiThrTree)malloc(sizeof(BiThrNode));  
        T->data=data2;  
        CreateBiThrTree(T->lchild);
		if(T->lchild)T->LTag=Link;  //不管左孩子是否存在,先初始化为指针,线索化的时候再改 
        CreateBiThrTree(T->rchild);  
        if(T->rchild)T->RTag=Link;  //不管右孩子是否存在,先初始化为指针,线索化的时候再改  
    }        
}  
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;//把当前结点赋给前驱 
		InThreading(p->rchild);//最后线索化右子树 
	}
}
void InOrderThreading(BiThrTree &Thrt,BiThrTree &T){//中序遍历的顺序线索化 
	Thrt = (BiThrTree)malloc(sizeof(BiThrNode));//先申请一个头结点 
	Thrt->LTag=Link;Thrt->RTag=Thread;//头结点左边为指针,右边为线索 
	Thrt->rchild=Thrt;//右边线索先回指 头结点 
	if(!T)Thrt->lchild=Thrt;//如果为空树,左边也回指头结点 
	else{
		Thrt->lchild=T;//头结点指向树根 
		pre=Thrt;//先前结点先设为头结点 
		InThreading(T);//中序遍历线索化 
		pre->rchild=Thrt;//pre为树的最后一个结点,后继指向头结点 
		pre->RTag=Thread;//右边为线索 
		Thrt->rchild=pre;//头结点前驱指向最后一个结点 
	}
}
void InOrderTraverse_Thr(BiThrTree &T){//遍历线索二叉树 
	BiThrTree p=T->lchild;
	while(p!=T){
		while(p->LTag==Link){p=p->lchild;}//一直沿左走 
		cout<<p->data;//输出当前结点 
		while(p->RTag==Thread&&p->rchild!=T){ 
			p=p->rchild;cout<<p->data;
		}
		p=p->rchild;//当遇到没有线索的结点时,下一个应该访问的结点是当前结点的右子树一直往左走找到左标志为1的结点 
	}
}
int main(){  
    BiThrTree T;//指向根结点的指针
	BiThrTree Thrt;//头结点  
    CreateBiThrTree(T);  
    InOrderThreading(Thrt,T);
    InOrderTraverse_Thr(Thrt);
    return 0;  
}  


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值