标签:
线索二叉树?什么是线索二叉树呢?一棵二叉树的左右叶子节点,注意是叶子节点,叶子的左结点和右结点一般为空,为了有效地利用其左右结点,我们将左结点指向他的前驱,将右结点指向他的后继!如图:
创建线索二叉树,遍历线索二叉树代码:
#include <stdio.h>
#include <stdlib.h>
typedef char ElemType;
//线索存储标志位
//Link(0) 表示指向左右孩子的指针
//Thread(1) 表示指向前驱后继的线索
typedef enum {Link,Thread} PointerTag;
typedef struct BiThrNode{
char Data;
struct BiThrNode *lchild,*rchild;
PointerTag ltag;
PointerTag rtag;
}BiThrNode,*BiThrTree;
//创建一棵二叉树,约定用户遵照前序遍历的方式输入数据
void CreateBiThrTree(BiThrTree *T){
char c;
scanf("%c",&c);//用户输入
if(' '==c){
*T=NULL;
}else{
*T=(BiThrNode*)malloc(sizeof(BiThrNode));
(*T)->data=c;
(*T)->ltag=Link;
(*T)->rtag=Link;
CreateBiThrTree(&(*T)->lchild);//递归调用
CreateBiThrTree(&(*T)->rchild);//递归调用
}
}
//中序遍历线索化
BiThrTree pre;//指向前一个访问的结点
InThreading(BiThrTree T){
if(T){
InThreading(T->lchild);//递归左孩子线索化
if(!T->lchild){
T->ltag=Thread;
T->lchild=pre;
}
if(!pre->rchild){
pre->rtag=Thread;
pre->rchild=T;
}
pre=T;
InThreading(T->rchild);//递归右孩子线索化
}
}
void InorderThreading(BiThrTree *p,BiThrTree T){
*p=(BiThrTree)malloc(sizeof(BiThrNode));
(*p)->ltag=Link;//设置为连接点
(*p)->rtag=Thread;//设置为线索
(*p)->rchild=*p;//初始化为指向自己
if(!T){
(*p)->lchild=*p;
}else{
(*p)->lchild=T;//它的左结点指向树的根
pre=*p;//初始化前一个结点
InThreading(T);//进行线索化
//由于进行线索化了之后pre会进行改变的,将其线索成一个环,看图1
pre->rchild=*p;
pre->rtag=Thread;
(*p)->rchild=pre;
}
}
void visit(char data){
printf("%c",data);
}
void InorderTraverse(BiThrTree T){
BiThrTree p;
p=T->lchild;//左子树
while(p!=T){//判断是否相同结点
while(p->ltag==Link){
p=p->lchild;
}
visit(p->data);
//通过线索找到上个结点
while(p->rtag==Thread && p->rchild!=T){
p=p->rchild;
visit(p->data);
}
p=p->rchild;
}
}
int main(){
BiThrTree P,T=NULL;
CreateBiThrTree(T);//创建二叉树
InorderThreading(&P,T);//线索二叉树
printf("中序遍历线索树:");
InorderTraverse(P);
printf("\n");
}
图1
标签:
原文地址:http://blog.csdn.net/mengzhisuoliu/article/details/45040781