您的位置:首页 > 其它

线索二叉树和中序非递归遍历线索化后的二叉树

2015-10-25 12:19 507 查看
//线索二叉树
#include<stdio.h>
#include<malloc.h>
#include<process.h>
#define OVERFLOW -2
//二叉树的二叉线索存储结构
enum PointerTag{Link,Thread};  //枚举类型,Link(0):指针,Thread(1):线索
struct BiThrNode
{
char data;
BiThrNode *lchild,*rchild;//左右孩子指针
PointerTag LTag,RTag;//左右标志
};
typedef BiThrNode *BiThrTree;

//按照先序的次序输入二叉树中节点的值,构造线索二叉树T,char,空格表示空节点
void CreateBiThrTree( BiThrTree &T)
{
char ch;
scanf("%c",&ch);
if(ch == ' ')
T=NULL;
else
{
T=(BiThrTree)malloc(sizeof(BiThrNode));//生成根节点,先序
if(!T)
exit(OVERFLOW);
T->data=ch;//给根节点赋值
CreateBiThrTree(T->lchild);//递归构造左子树
if(T->lchild)//如果有左孩子
T->LTag=Link;//给坐标值赋值为0
CreateBiThrTree(T->rchild);//递归构造右子树
if(T->rchild)
T->RTag=Link;//如果有右孩子,就给右标志赋值为0
}
}
BiThrTree pre;//全局变量,始终指向刚刚访问过的节点

//通过中序遍历进行中序线索化,线索化之后,pre指向最后一个节点
void InThreading(BiThrTree p)//p为指向根节点的指针
{
if(p)//线索二叉树不空
{
InThreading(p->lchild);//递归左子树线索化
if(!p->lchild)//左子树为空
{
p->LTag=Thread;//左标志为线索
p->lchild=pre;//左孩子指针指向前驱
}
if(!pre->rchild)//如果前驱没有右孩子
{
pre->RTag=Thread;//前驱的右孩子为线索
pre->rchild=p;//前驱的右孩子节点指向其后继节点,(即当前节点p)
}
pre=p;//保持pre指向p的前驱
InThreading(p->rchild);//递归右子树线索化
}
}
//中序遍历二叉树T,将其中序线索化,Thrt指向头结点
void InOrderThreading(BiThrTree &Thrt,BiThrTree T)
{
Thrt=(BiThrTree)malloc(sizeof(BiThrNode));//生成头结点
if(!Thrt)
exit(OVERFLOW);
Thrt->LTag=Link;//建立头结点左标志为指针
Thrt->RTag=Thread;//右标志为线索
Thrt->lchild=Thrt;//右指针回指
if(!T)//如果二叉树空则左指针回指
Thrt->lchild=Thrt;
else
{
Thrt->lchild=T;//头指针的左指针指向根节点
pre=Thrt;//pre的初值指向头结点
InThreading(T);//中序遍历,进行中序线索化,pre指向中序遍历后的最后一个节点
//收尾工作
pre->RTag=Thread;//最后一个节点的右标志为线索
pre->rchild=Thrt;//最后一个节点的右指针指向头结点
Thrt->rchild=pre;//头节点的右指针指向中序遍历的最后一个节点
}
}
//中序遍历线索化后的二叉树T(头节点)的非递归算法
void InOrderTraverse_Thr(BiThrTree T)
{
BiThrTree p;
p=T->lchild;//p指向根节点
while(p != T) //空树或者是遍历结束时,p==T
{
while(p->LTag == Link)//由根节点一直找到二叉树的最左节点
p=p->lchild;
printf("%c ",p->data);//访问此节点
while(p->RTag == Thread && p->rchild != T)//p->rchild是后继,且不是遍历的最后一个节点
{
p=p->rchild;
printf("%c ",p->data);//访问后继节点
}
p=p->rchild;//若p->rchild不是线索,p指向右孩子,返回循环,找这棵子树中序遍历的第一个节点
}
}
void main()
{
BiThrTree H,T;
printf("请按照先序的次序输入二叉树:\n");
CreateBiThrTree(T);//按照先序产生二叉树
InOrderThreading(H,T);//H是头,T是根,中序遍历的过程中,中序线索化二叉树
printf("中序遍历线索二叉树:");
InOrderTraverse_Thr(H);
printf("\n");
}

程序的运行结果:



以下图片能够帮助你更好地理解本程序:



图一 空的二叉树



图二 二叉树的二叉线索存储结构



图三
CreateBiThrTree()产生的二叉树



图四 中序线索二叉树存储结构



图 5

中序线索化二叉树
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: