码迷,mamicode.com
首页 > 其他好文 > 详细

线索二叉树

时间:2015-04-14 16:45:13      阅读:146      评论:0      收藏:0      [点我收藏+]

标签:

线索二叉树?什么是线索二叉树呢?一棵二叉树的左右叶子节点,注意是叶子节点,叶子的左结点和右结点一般为空,为了有效地利用其左右结点,我们将左结点指向他的前驱,将右结点指向他的后继!如图:

技术分享

创建线索二叉树,遍历线索二叉树代码:

#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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!