您的位置:首页 > 理论基础 > 数据结构算法

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

2016-02-15 12:52 796 查看
下面是用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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息