3. 中序线索二叉树
【问题描述】创建一棵二叉树,接着中序线索化该二叉树,然后编写相应函数遍历该中序线索二叉树
【编码要求】线索二叉树遍历过程中不能使用递归、不能使用栈。
【输入形式】二叉树拓展的前序遍历序列
【输出形式】中序遍历序列
【样例输入】AB#D##CE###
【样例输出】BDAEC
#include <iostream>
using namespace std;
#include <cstring>
struct node
{
char data;
node *lchild;
node *rchild;
int ltag, rtag;
};
char a[100];
node *build(int len, int &i)
{
if (i < len && a[i] != '#')
{
node *r = new node;
r->data = a[i];
r->ltag = r->rtag = 0;
r->lchild = build(len, ++i);
r->rchild = build(len, ++i);
return r;
}
else
return NULL;
}
node *pre = NULL;
void build_thread(node *root)
{
if (root == NULL)
return;
build_thread(root->lchild);
if (root->lchild == NULL)
{
root->lchild = pre;
root->ltag = 1;
}
if (pre != NULL && pre->rchild == NULL)
{
pre->rchild = root;
pre->rtag = 1;
}
pre = root;
build_thread(root->rchild);
}
node *left(node *p)
{
while (p != NULL && p->ltag == 0 && p->lchild != NULL)
p = p->lchild;
return p;
}
void output(node *root)
{
node *p = left(root);
while (p != NULL)
{
cout << p->data;
if (p->rtag == 1)
{
p = p->rchild;
}
else
{
p = left(p->rchild);
}
}
return;
}
int main()
{
ios::sync_with_stdio(false);
cin >> a;
int i = 0;
node *r = build(strlen(a), i);
build_thread(r);
output(r);
}