线索二叉树的构建和中序遍历(包括测试)
线索二叉树
对应的线索二叉树的结点定义如下:
#include<stdio.h>
#include<stdlib.h>
#define maxsize 20
typedef struct TBTNode {
char data;
int ltag, rtag;
struct TBTNode* lchild;
struct TBTNode* rchild;
}TBTNode;
通过中序遍历二叉树线索化的递归算法如下
void InThread(TBTNode* p, TBTNode* &pre)
{
if (p != NULL)
{
InThread(p->lchild, pre); //递归左子树线索化
if (p->lchild == NULL)
{
p->ltag = 1; //设置为线索
p->lchild = pre;
}
else {
p->ltag = 0; //设置为指针
p->rtag = 0;
}
if (pre != NULL && pre->rchild == NULL)
{
pre->rtag = 1; //设置为线索
pre->rchild = p;
}
pre = p; //pre始终是p的前驱
InThread(p->rchild, pre); //递归右子树线索化
}
}
通过中序遍历建立中序线索二叉树的主程序如下:
void createInThread(TBTNode* root)
{
TBTNode* pre = NULL; //前驱结点指针
if (root != NULL)
{
InThread(root, pre);
pre->rchild = NULL; //处理最后一个结点
pre->rtag = 1;
}
}
遍历中序线索二叉树
void visit(TBTNode* bt)
{
printf("遍历:");
printf("%c\n", bt->data);
}
TBTNode* First(TBTNode* p)
{
while (p->ltag == 0)
p = p->lchild; //最左下结点(不一定是叶子结点)
return p;
}
TBTNode* Next(TBTNode* p)
{
if (p->rtag == 0) //表示指针
return First(p->rchild); //遍历右子树
else
return p->rchild; //表线索,直接返回后继节点
}
void Inorder(TBTNode* root)
{
for (TBTNode* p = First(root); p != NULL; p = Next(p))
visit(p);
}
前序构建一颗普通二叉树做测试
void createtree(TBTNode *&T)
{
char c;
scanf("%c", &c);
if (' ' == c)
T = NULL;
else
{
T = (TBTNode*)malloc(sizeof(TBTNode));
T->data = c;
createtree(T->lchild);
createtree(T->rchild);
}
}
主函数
void main()
{
TBTNode* T=NULL;
createtree(T);
createInThread(T);
Inorder(T);
}
运行如图所示
测试图形:
测试结果: