现在的位置: 首页 > 综合 > 正文

一步一步复习数据结构和算法基础-前序线索二叉树

2018年04月28日 ⁄ 综合 ⁄ 共 1792字 ⁄ 字号 评论关闭

原来的博客地址:

http://blog.csdn.net/flying0033/article/details/6935393

那个博主的代码我当初直接复制运行结果不行。

后来自己改动了一下:

线索二叉树线索化的实质是遍历的过程修改空指针的过程:

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef enum{Link,Thread} PointTag;
typedef char Element;
typedef int Status;
typedef struct Node{
	Element data;
	struct Node* left;  //指向左孩子
	struct Node* right; //指向右孩子
	PointTag Ltag;   //左右标志
	PointTag Rtag;
}BitNode,*BitTree;
Status visit(Element e);
Status CreateTree(BitTree *T);
void InThreading(BitTree T);
void InOrderThreading(BitTree *H,BitTree T);
Status InOrderTraverse_Thr(BitTree L);

BitTree pre;
Status visit(Element e)  //打印元素
{
	printf("%c ",e);
	return OK;
}
Status CreateTree(BitTree *T) //前序创建二叉树
{
	Element ch;
	scanf("%c",&ch);
	if(ch == '#')
		(*T) = NULL;
	else
	{
		(*T) = (BitTree)malloc(sizeof(BitNode));
		if(!(*T))
			exit(OVERFLOW);
		(*T)->data = ch;
		CreateTree(&(*T)->left);
		if((*T)->left)          //初始化标志,有左孩子为Link
			(*T)->Ltag = Link;
		CreateTree(&(*T)->right);
		if((*T)->right)
			(*T)->Rtag = Link;
	}
	return OK;
}
void InThreading(BitTree p) //前序线索化二叉树
{
	if(p)
	{
		if(!p->left)
		{
			p->left = pre;
			p->Ltag = Thread;
		}
		if(!pre->right)
		{
			pre->right = p;
			pre->Rtag = Thread;
		}
		pre = p;
		if(p->Ltag == Link)
			InThreading(p->left);
		if(p->Rtag == Link)
			InThreading(p->right);
	}
}
void InOrderThreading(BitTree *H,BitTree T)
{
	(*H) = (BitTree)malloc(sizeof(BitNode));  //建立头结点
	if(!(*H))
		exit(OVERFLOW);
	(*H)->right = (*H); //右指针回指
	(*H)->Rtag = Link;
	if(!T)
	{
		(*H)->left = (*H);
		(*H)->Ltag = Link; //二叉树为空,则左指针回指
	}
	else
	{
		pre = (*H);
		(*H)->left = T;
		(*H)->Ltag = Link;
		InThreading(T);		//前序遍历进行中序线索化
		pre->right = (*H);
		pre->Rtag = Thread;
		(*H)->right = pre;
	}
}
Status InOrderTraverse_Thr(BitTree L) //前序遍历线索化二叉树
{
	BitTree p = L->left;
	while(p != L)
	{
		visit(p->data);
		if(p->Ltag == Link)
			p = p->left;
		else
			p = p->right;
	}
	return OK;
}

int main()
{
	BitTree H,T;
	printf("请输入二叉树数据,空值以'#'代替,例如:('ABDH##I##EJ###CF##G##')\n");
	CreateTree(&T);
	InOrderThreading(&H,T);
	printf("前序遍列序号为:\n");
	InOrderTraverse_Thr(H);
	return 0;
}

抱歉!评论已关闭.