先序建立线索二叉树并实现访问前节点与后节点的函数
#include<iostream>
#include<stdio.h>
#define ElementType char
typedef struct Thread_Tree* Thread_Pointer;
static Thread_Pointer PreNode=NULL;
typedef struct Thread_Tree {
ElementType data;
short int Ltag;
short int Rtag;
Thread_Pointer left_Child;
Thread_Pointer right_Child;
Thread_Pointer nextNode(Thread_Pointer p);
Thread_Pointer preNode(Thread_Pointer p);
void CreateBithread(Thread_Pointer &T);
void InOrderThreading(Thread_Pointer& T);
void InThreading(Thread_Pointer&T);
};
Thread_Pointer Thread_Tree::nextNode(Thread_Pointer p) {
if (p->Rtag)return p->right_Child;
Thread_Pointer next = p->right_Child;
while (!next->Ltag)
{
next = next->left_Child;
}
return next;
}
Thread_Pointer Thread_Tree::preNode(Thread_Pointer p) {
if (p->Ltag)return p->left_Child;
Thread_Pointer pre=p->left_Child;
while (!pre->Rtag)
{
pre = pre->right_Child;
}
return pre;
}
void Thread_Tree::CreateBithread(Thread_Pointer& T) {
ElementType ch;
scanf_s("%c",&ch);
if (ch == '#')T = NULL;
else
{
T = (Thread_Pointer)malloc(sizeof(Thread_Tree));
if (!T)exit(OVERFLOW);
T->data = ch;
T->Ltag = 1;
T->Rtag = 1;
CreateBithread(T->left_Child);
if (T->left_Child)T->Ltag = 0;
CreateBithread(T->right_Child);
if (T->right_Child)T->Rtag = 0;
}
}
void Thread_Tree::InOrderThreading(Thread_Pointer& T) {
Thread_Pointer head = (Thread_Pointer)malloc(sizeof(Thread_Tree));
head->Ltag = 0;
head->Rtag = 1;
head->right_Child = head;
if (!T)head->left_Child = head;
else
{
head->left_Child = T;
PreNode = head;
InThreading(T);
PreNode->right_Child = head;
head->right_Child = PreNode;
}
T = head;
}
void Thread_Tree::InThreading(Thread_Pointer& T) {
if (T) {
InThreading(T->left_Child);
if (T->Ltag)T->left_Child = PreNode;
if (PreNode->Rtag)PreNode->right_Child = T;
PreNode = T;
InThreading(T->right_Child);
}
}
int main() {
std::cout << "请输入树的节点信息,例如‘abdg###e##c#f##’,其中#代表空" << std::endl;
Thread_Pointer Test_Tree;
Test_Tree->CreateBithread(Test_Tree);
Test_Tree->InOrderThreading(Test_Tree);
system("pause");
}