如果ltag值为0,表示lchild指向结点的左孩子,如果ltag=1,表示lchild结点指向结点的前驱;如果rtag=0,表示rchild指向结点的右孩子,如果rtag=1,表示rchild指向结点的后继。
要求输入一个先序创建二叉树所需要的先序序列,按照中序方式输出该二叉树所对应的线索二叉树的每个结点,包括它的ltag,data,rtag三个域的值。二叉树的数据域类型为字符型,扩展二叉树的叶子结点用‘#’表示。
输入描述:
输入一棵扩展二叉树的先序遍历序列,共用一行,直接输入某二叉树的加了叶子结点的扩展二叉树字符序列,以空格隔开。
输出描述:
输出中序遍历的该二叉树所对应线索二叉树的每个结点,包括它的ltag,data,rtag域,输出格式为每行一个结点,数据之间以空格隔开
输入样例:
A B # # C D # E # F # # G H # I K # # # #
输出样例:
1 B 1
0 A 0
1 D 0
1 E 0
1 F 1
0 C 0
1 H 0
1 K 1
0 I 1
0 G 1
#include<iostream>
using namespace std;
struct Node
{
char data;
Node *lchild,*rchild;
int ltag,rtag;
};
class InTree
{
public:
InTree();
Node *next(Node *p);
void InOrder();
void inOrder()
{
inOrder(root);
}
protected:
Node *root;
Node *Creat(Node *b);
void print(Node *b,Node *pre);
void inOrder(Node *b);
};
Node *InTree::Creat(Node *b)
{
char ch;
cin>>ch;
Node *c;
if(ch=='#')
{
b = NULL;
}
else
{
b = new Node;
b->data = ch;
b->lchild = Creat(b->lchild);
if(b->lchild == NULL)
b->ltag = 1;
else
{
b->ltag = 0;
}
b->rchild = Creat(b->rchild);
if(b->rchild == NULL)
b->rtag = 1;
else
{
b->rtag = 0;
}
}
return b;
}
void InTree::print(Node *b,Node *pre)
{
if(b==NULL)
return ;
print(b->lchild,pre);
if(b->lchild==NULL)
{
b->ltag = 1;
b->lchild = pre;
}
if(b->rchild==NULL)
{
b->rtag = 1;
}
if(pre->rtag==1)
{
pre->rchild = b;
}
pre = b;
print(b->rchild,pre);
}
InTree::InTree()
{
root = Creat(root);
}
Node *InTree::next(Node *p)
{
Node *q;
if(p->rtag==1)
{
q = p->rchild;
}
else
{
q = p->rchild;
while(q->ltag ==0)
{
q = q->lchild;
}
}
return q;
}
void InTree::InOrder()
{
Node *p;
if(root==NULL)
return ;
while(p->ltag==0)
p = p->lchild;
cout<<p->data;
while(p->rchild!=NULL)
{
p = next(p);
cout<<p->data;
}
}
void InTree::inOrder(Node *b)
{
if(b==NULL)
{
return ;
}
else
{
inOrder(b->lchild);
cout<<b->ltag<<" ";
cout<<b->data<<" ";
cout<<b->rtag<<endl;
inOrder(b->rchild);
}
}
int main()
{
InTree a;
a.inOrder();
return 0;
}