头文件
#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
来源:CSDN
作者:赵健zj
链接:https://blog.csdn.net/AdrianAndroid/article/details/104592938