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);
}
核心代码都是严蔚敏教材上的,如果是自己写出来的就好了= =