C语言数据结构 中序线索二叉树的实现(树的初始化、树的带值创建、树的线索化、线索树的遍历)

IDE:Visual Studio 2019
声明:为了方便书写代码,用到了C++的引用调用特性和iostream作为输入输出,读者可以使用指针调用和scanf_s/print语句实现相同效果
tips:有疑问可以在下面交流,我会尽量回复的

头文件heads.h

#pragma once
#include "stdio.h"
#include "iostream"
#define OK 1
#define TRUE 1
#define FALSE 0
#define ERROR 0
#define OVERFLOW -1
using namespace std;
typedef short int Status;

头文件Treefunctions.h

#include "heads.h"
typedef char TElemType;//元素是char类型,所以数字只支持1-9,如果有更多需要可以用字符串作为数据类型
typedef enum PointerTag{Link,Thread};
//二叉线索树结构体
typedef struct BiThrTNode {
	TElemType data;
	struct BiThrTNode* lchild, * rchild;
	PointerTag LTag, RTag;
}BiThrTNode, * BiThrTree;
//树的数据访问
Status visit(TElemType e);
//中序遍历二叉树T使其中序线索化
Status InOrderThreading(BiThrTree& Thrt, BiThrTree T);
//二叉线索树的遍历
Status InOrderTraverse_Thr(BiThrTree T, Status(*visit)(TElemType e));
//递归建立二叉树
Status CreateBiThrTree(BiThrTree& T);

源文件BiThrTree_functions.cpp

#include "Treefunctions.h"
//visit函数
Status visit(TElemType e) {
	cout << e << ' ';
	return OK;
}
BiThrTree pre;//全局变量
//创造空二叉树
Status InitBiThrTree(BiThrTree& T) {
	T = (BiThrTree)malloc(sizeof(BiThrTNode));
	if (!T)return ERROR;
	T->LTag = Link;
	T->RTag = Link;
	T->lchild = NULL;
	T->rchild = NULL;
	return OK;
}//InitBiThrTree
//创造结点
Status InitBiThrTNode(BiThrTree& b, TElemType e) {
	b = (BiThrTNode*)malloc(sizeof(BiThrTNode));
	if (!b)return ERROR;
	b->data = e;
	b->LTag = Link;
	b->RTag = Link;
	b->lchild = NULL;
	b->rchild = NULL;
	return OK;
}//InitBiThrTNode
//赋予一个结点新的子树
void StackThrNode(BiThrTNode* b) {
	BiThrTNode* q, * p;
	TElemType a, c;
	cout << "输入左子树,#代表无该子树" << endl;
	cin >> a;
	if (a != '#') {
		InitBiThrTNode(p, a);
		b->lchild = p;
		StackThrNode(b->lchild);
	}
	cout << "输入右子树,#代表无该子树" << endl;
	cin >> c;
	if (c != '#') {
		InitBiThrTNode(q, c);
		b->rchild = q;
		StackThrNode(b->rchild);
	}
}//StackThrNode
//递归建立二叉树
Status CreateBiThrTree(BiThrTree& T) {
	InitBiThrTree(T);
	cin >> T->data;
	StackThrNode(T);
	return OK;
}//CreateBiThrTree
//二叉线索树的遍历
Status InOrderTraverse_Thr(BiThrTree T, Status(*visit)(TElemType e)) {
	//T为头结点
	BiThrTree p = T->lchild;
	while (p != T) {
		while (p->LTag == Link)p = p->lchild;
		if (!visit(p->data))return ERROR;
		while (p->RTag == Thread && p->rchild != T) {
			p = p->rchild; visit(p->data);
		}
		p = p->rchild;
	}
	return OK;
}//InOrderTraverse_Thr
Status 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);
	}
	return OK;
}
//中序遍历二叉树T使其中序线索化
Status InOrderThreading(BiThrTree& Thrt, BiThrTree T) {
	if (!(Thrt = (BiThrTree)malloc(sizeof(BiThrTNode))))exit(OVERFLOW);
	Thrt->LTag = Link; Thrt->RTag = Thread;
	Thrt->rchild = Thrt;
	if (!T)Thrt->lchild = T;
	else {
		Thrt->lchild = T; pre = Thrt;
		InThreading(T);
		pre->rchild = Thrt; pre->RTag = Thread;
		Thrt->rchild = pre;
	}
	return OK;
}//InOrderThreading

源文件main.cpp

#include "Treefunctions.h"
int main(void) {
	BiThrTree T,Thrt;
	CreateBiThrTree(T);
	InOrderThreading(Thrt, T);
	InOrderTraverse_Thr(Thrt, visit);
}

核心代码都是严蔚敏教材上的,如果是自己写出来的就好了= =

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值