线索二叉树的建立

一、代码地址讲解

小甲鱼数据结构:https://www.bilibili.com/video/av2975983/?p=50&t=2599

二、代码如下

/*
项目名称:线索二叉树
编译环境:VC++ 2008
作者相关:。。。
最后修改:2019.10.19
学习目标:1.先了解下线索二叉树
注意事项:1.测试所有功能是否正常
*/
#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;

//全局变量始终指向刚刚访问过的结点
BiThrTree pre;
//创建二叉树,约定用户遵照前序遍历的方式
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);
	}
}
//中序遍历线索化
void InThreading(BiThrTree T)
{
	if(T)
	{
		InThreading(T->lchild);//递归左孩子线索化
		if(!T->lchild)//如果该结点没有左孩子,设置ltag为Thread并把lchild指向刚刚访问的结点
		{
			T->ltag=Thread;
			T->lchild=pre;
		}
		if(!pre->rchild)//前结点的右指针需要判断是线索还是指向右孩子
		{
			pre->rtag=Thread;
			pre->rchild=T;//线索的话就指向T,它是T->lchild的前驱
		}
		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;//pre指向该头指针
		InThreading(T);//对树T线索化,直到最后一个元素,此时pre指向最后元素
		pre->rchild=*p;//最后元素的右孩子指向头指针
		pre->rtag=Thread;//最后元素的右指针线索化
		(*p)->rchild=pre;//头指针的右孩子指向最后一个元素
	}
}

void visit(char c)
{
	printf("%c",c);
}

//中序遍历二叉树非递归
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("中序遍历(输出)二叉线索树:\n");
	InOrderTraverse(P);
	printf("\n");

	return 0;
}

三、树和结果

发布了62 篇原创文章 · 获赞 9 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/Sruggle/article/details/102643369