线索二叉树

时光总嘲笑我的痴心妄想 提交于 2020-03-01 17:57:01

头文件

#pragma once

#include <stdio.h>
#include <stdlib.h>

//函数状态结果代码
#define TRUE_THR 1
#define FALSE_THR 0
#define OK_THR 1
#define ERROR_THR 0
#define INFEASIBLE_THR -1
#define OVERFLOW_THR -2

//Status是函数的类型;其值是函数结果状态代码
typedef char TElemType;

typedef enum {Link, Thread} PointerTag;

typedef struct BiThrNode {
	TElemType data;
	struct BiThrNode* lchild, * rchild;
	PointerTag LTag;
	PointerTag RTag;
}BiThrNode, *BiThrTree;

//线索二叉树初始化
int CreateBiThrNode(BiThrTree* B);
//线索二叉树线索化
void InThreading(BiThrTree B, BiThrTree* pre);
//为线索二叉树添加头结点,使之可以双向操作
int InOrderThreading(BiThrTree* Thrt, BiThrTree T);
//非递归遍历线索二叉树
int InOrderTraverse(BiThrTree T);

cpp文件

#include "BiThrNodeTest.h"


//线索二叉树初始化
int CreateBiThrNode(BiThrTree* B) {
	char ch;
	scanf("%c", &ch);
	if (ch == '@')
	{
		*B = NULL;
	}
	else
	{
		if (!((*B) = (BiThrNode *)malloc(sizeof(BiThrNode)))) exit(OVERFLOW_THR);
		(*B)->data = ch;
		(*B)->LTag = Link;
		(*B)->RTag = Link;
		CreateBiThrNode(&(*B)->lchild);
		CreateBiThrNode(&(*B)->rchild);
	}
	return OK_THR;
}
//线索二叉树线索化
void InThreading(BiThrTree B, BiThrTree* pre) {
	if (!B) return;
	InThreading(B->lchild, pre);

	if (!B->lchild) {
		B->LTag = Thread;
		B->lchild = *pre;
	}

	if (!B->rchild) {
		(*pre)->RTag = Thread;
		(*pre)->rchild = B;
	}

	*pre = B;
	InThreading(B->rchild, pre);
}
//为线索二叉树添加头结点,使之可以双向操作
int InOrderThreading(BiThrTree* Thrt, BiThrTree T) {
	if (!(*Thrt = (BiThrTree)malloc(sizeof(BiThrNode)))) exit(OVERFLOW_THR);
	(*Thrt)->LTag = Link;
	(*Thrt)->RTag = Thread;
	(*Thrt)->rchild = (*Thrt);
	if (!T) {
		(*Thrt)->lchild = (*Thrt);
		return OK_THR;
	}
	BiThrTree pre;
	//令头节点的做指针指向根节点
	pre = (*Thrt);
	(*Thrt)->lchild = T;
	//开始递归输入线索化
	InThreading(T, &pre);
	//此时结束了最后一个结点的线索化了,下面的代码把头结点的后继指向了最后一个结点.
	//并把最后一个结点的后继也指向头结点,此时树成为了一个类似双向链表的循环.
	pre->rchild = *Thrt;
	pre->RTag = Thread;
	(*Thrt)->rchild = pre;
	return OK_THR;
}
//非递归遍历线索二叉树
int InOrderTraverse(BiThrTree T) {
	BiThrNode* p = T->lchild;
	while (p!=T)
	{
		while (p->LTag == Link) p = p->lchild;//走向左子树的尽头
		printf("%c", p->data);
		while (p->RTag==Thread&&p->rchild!=T)
		{
			p = p->rchild;
			printf("%c", p->data);
		}
		p = p->rchild;
	}

	return OK_THR;
}

int testmain()
{
	BiThrTree B, T;
	CreateBiThrNode(&B);
	InOrderThreading(&T, B);
	printf("中序遍历二叉树的结果为:");
	InOrderTraverse(T);
	printf("\n");
	return 0;
};

资料

线索二叉树(详解)
https://blog.csdn.net/s_999999/article/details/86157532

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!