数据结构-线索化二叉树

线索化二叉树并输出其中序遍历结果。

1. 首先,在线索化二叉树之前,要有一个二叉树所以先序创建二叉树。

2. 将二叉树线索化。

3. 把线索化后的二叉树当做双向链表进行遍历。

代码如下:

#include"stdio.h"
#include"stdlib.h"
#include"conio.h"
#include<iostream>

using namespace std;

typedef enum PointerTag { Link, Thread };
typedef struct BiThrNode
{
	int data;                  //节点的数据域
	PointerTag ltag, rtag;            //增加的线索标记
	struct BiThrNode *lchild;      //当ltag=0时lchild代表左节点,ltag=1时代表没有左节点lchild代表的是前驱节点
	struct BiThrNode *rchild;      //当rtag=0时rchild代表右节点,rtag=1时代表没有右节点rchild代表的是后继节点
} BiThrNode, *BiThrTree;                   //线索数的节点类型定义
void InThreaing(BiThrTree p);
BiThrTree pre;
void CreatBiThrTree(BiThrTree &T)
{      //创建线索二叉树 
	int a;
	cin >> a;
	if (a == 0)   T = NULL;
	else {
		if (!(T = (BiThrTree)malloc(sizeof(BiThrNode)))) printf("储存分配失败了!!\n");
		T->data = a;
		T->ltag = Link;
		T->rtag = Link;
		CreatBiThrTree(T->lchild);
		CreatBiThrTree(T->rchild);
	}
}

void InOrderThreaing(BiThrTree &Thrt, BiThrTree T)
{    //中序遍历二叉树 并使其线索化 Thrt指向头结点

	if (!(Thrt = (BiThrTree)malloc(sizeof(BiThrNode)))) printf("空间分配不足!!\n");
	Thrt->ltag = Link; Thrt->rtag = Thread;
	Thrt->rchild = Thrt;
	if (!T) Thrt->lchild = Thrt;
	else {
		Thrt->lchild = T;
		pre = Thrt;
		InThreaing(T);
		pre->rchild = Thrt;
		pre->rtag = Thread;
		Thrt->rchild = pre;
	}
}
void InThreaing(BiThrTree p)
{      //线索化

	if (p->lchild)
        InThreaing(p->lchild);      //左子树线索化
		
	    if (!p->lchild) { p->ltag = Thread; p->lchild = pre; } //前驱线索
		if (!pre->rchild) { pre->rtag = Thread; pre->rchild = p; }//后继线索

		
	    pre = p; //保持pre指向前驱
		if(p->rchild )
	    InThreaing(p->rchild); //右子树线索化
}

void visit(BiThrTree T)
{
	printf("%d  ", T->data);
}

void InOrderTraverse_Thr(BiThrTree T)
{
	BiThrTree p = T->lchild;
	printf("中序遍历结果为:\n");
	while (p != T) {
		while (p->ltag == Link) p = p->lchild;
		visit(p);
		if (!p) ;
		else {
			while (((p->rtag == Thread&&p->rchild != T)||(p->rtag ==Link))&&p->ltag==1)
			{
				p = p->rchild;
				visit(p);
			}
			p = p->rchild;
		}
	} 
}
int main()
{
	BiThrTree T, Thrt;
	if (!(pre = (BiThrTree)malloc(sizeof(BiThrNode)))) printf("空间分配不足!!\n");
	CreatBiThrTree(T);
	InOrderThreaing(Thrt, T);
	InOrderTraverse_Thr(Thrt);
	char ch = getchar();
	ch = getchar();
	return 0;
}

我先序建立的二叉树为:1 2 3 0 0 4 0 5 0 0 6 0 0(其中0代表无节点)

我的例子的对应的二叉树图形如下(其中0代表此处无节点):


其运行结果如下:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值