#include <stdio.h>
#include <stdlib.h>
typedef char elemType;
typedef struct BiTNode
{
elemType data;
struct BiTNode *lchild, *rchild;
int LTag, RTag;
}BiThreadNode, *BiThreadTree;
BiThreadNode * pre; //当前访问节点的前驱
//输出元素x
void visit(elemType x)
{
printf("%c, ", x);
}
//先序输入节点的值,构造二叉树
BiThreadTree createBiThreadTree()
{
BiThreadNode * T;
char ch;
if ((ch = getchar()) == '#')
T = NULL;
else
{
T = (BiThreadNode *)malloc(sizeof(BiThreadNode));
T->data = ch;
T->lchild = createBiThreadTree();
T->rchild = createBiThreadTree();
}
return T;
}
//中序遍历线索化
void InThreading(BiThreadTree T)
{
if (T != NULL)
{
InThreading(T->lchild); //线索化左子树
if (T->lchild == NULL) //左孩子为空,则lchild指向前驱pre
{
T->LTag = 1;
T->lchild = pre;
}
else T->LTag = 0;
if (pre->rchild == NULL) //前驱pre右孩子为空,则当前节点为前驱pre的后继
{
pre->RTag = 1;
pre->rchild = T;
}
else pre->RTag = 0;
pre = T;
InThreading(T->rchild); //线索化右子树
}
}
//创建中序线索二叉树
BiThreadNode *CreateInThrTree(BiThreadTree T)
{
BiThreadNode * ThrHead; //中序线索二叉树头节点(非根节点)
/*
* 设中序遍历第一个节点、最后一个节点分别为first、last
* 则:first->lchild指向ThrHead
* last->rchild指向ThrHead
* ThrHead->lchild:指向根节点
* ThrHead->rchild:指向last
*/
ThrHead = (BiThreadNode *)malloc(sizeof(BiThreadNode));
ThrHead->RTag = 1;
ThrHead->rchild = ThrHead; //先将ThrHead->rchild指向自身
ThrHead->LTag = 0;
if (T == NULL) ThrHead->lchild = ThrHead; //若根节点为空,则ThrHead->lchild指向自身
else
{
ThrHead->lchild = T;
pre = ThrHead; //将ThrHead赋给pre,pre为中序线索树中first节点前驱
InThreading(T); //二叉树线索化完毕,pre指向last节点
pre->rchild = ThrHead; //将ThrHead作为last节点后继
pre->RTag = 1;
ThrHead->rchild = pre; //将ThrHead->rchild指向pre(last)
}
return ThrHead;
}
//遍历中序线索二叉树
void ThrInOrderTraverse(BiThreadTree ThrHead)
{
BiThreadNode * temp = ThrHead->lchild; //让temp指向根节点
while (temp != ThrHead)
{
while (temp->LTag == 0) temp = temp->lchild; //向左走到尽头
visit(temp->data);
while (temp->RTag == 1 && temp->rchild != ThrHead)
{ //若当前节点无右子树且后继不是头节点,则输出后继的值
temp = temp->rchild;
visit(temp->data);
}
temp = temp->rchild; //遍历右子树
}
}
int main()
{
BiThreadTree root;
printf("请按先序顺序输入节点值,输入‘#’代表节点为空:\n");
root = createBiThreadTree();
BiThreadNode * ThrHead = CreateInThrTree(root);
ThrInOrderTraverse(ThrHead);
printf("\n");
return 0;
}
线索二叉树的基本操作 C语言
最新推荐文章于 2024-02-05 20:11:59 发布