#include<iostream>
using namespace std;
#define MAL (NODE*)malloc(sizeof(NODE))
//线索二叉树
//如果ltag=0则指向左孩子,如果ltag=1,则表示lchild为线索,指向直接前驱。
//如果rtag=0则指向右孩子,如果rtag=1,则表示rchild为线索,指向直接后继。
typedef struct node
{
char data;
int ltag;
int rtag;
struct node* lchild;
struct node* rchild;
}NODE;
NODE* Create()
{
NODE *p;
char ch;
cin >> ch;
if (ch == '#')
p = NULL;
else
{
p = (NODE*)malloc(sizeof(NODE));
p->data = ch;
p->ltag = p->rtag = 0;
p->lchild = Create();
p->rchild = Create();
}
return p;
}
void Print(NODE *p)
{
if (p != NULL)
{
cout << p->data;
Print(p->lchild);
Print(p->rchild);
}
}
void InThread(NODE *p, NODE *&pre)//因为pre指针会变,所以传指针的引用
{
if (p != NULL)
{
InThread(p->lchild, pre); //左子树线索化
if (p->lchild == NULL)
{ // 建立当前节点的前驱线索
p->lchild = pre;
p->ltag = 1;
}
if (pre != NULL&&pre->rchild == NULL)
{ //建立当前节点的后继线索
pre->rchild = p;
pre->rtag = 1;
}
pre = p;
InThread(p->rchild, pre);
}
}
//中序建立线索二叉树
void CreateInThread(NODE *root)
{
NODE *pre = NULL; //前驱节点指针
if (root != NULL)
{
InThread(root, pre);
pre->rchild = NULL;//处理最后一个节点
pre->rtag = 1;
}
}
NODE *First(NODE *p)
{
while (p->ltag == 0)
p = p->lchild; //最左下节点 (不一定是叶子节点)
return p;
}
NODE * Next(NODE *p) //求p在中序下的后继节点
{//由于中序遍历是左中右的方式,所以求以p的下一个节点就是右子树中最左下的节点
if (p->rtag == 0) //如果有右子树的话,就要找出右子树中最左下节点
return First(p->rchild);
else
return p->rchild;
}
int main()
{
NODE *a;
a = Create();
Print(a);
CreateInThread(a);
// cout << First(a)->data;
system("pause");
return 0;
}
线索二叉树
最新推荐文章于 2022-11-19 17:53:05 发布