【王道例3.4】通过二叉树遍历结果建立二叉树
题目
思路
根据先序遍历可以知道第一个字符一定是根节点,然后在中序遍历中,找到对应的根节点,则其左边的字母组成了左子树,右边的字母组成了右子树。
例如示例中:
代码
#include<bits/stdc++.h>
using namespace std;
typedef struct BiNode{
struct BiNode *lchild;
struct BiNode *rchild;
char data;
}*BiTree;
string s1,s2; //s1存储前序遍历,s2存储中序遍历
int cen=0;
//分析s2 p~q段,s1 a~b段 建立二叉树T
void BuildTree(BiTree &T,int p,int q,int a,int b)
{
T=(BiTree)malloc(sizeof(BiNode));
T->data=s1[a]; //先序第一个一定为此时的根节点
T->lchild=T->rchild=NULL;
int loc;
for(int i=p;i<=q;i++) //找出跟结点在中序遍历的位置,将左右子树隔开
{
if(T->data==s2[i])
{
loc=i;
break;
}
}
if(loc!=p) //左子树存在
{
BuildTree(T->lchild,p,loc-1,a+1,a+(loc-p)); //loc-p为左边字符串的宽度
}
if(loc!=q) //右子树存在
{
BuildTree(T->rchild,loc+1,q,a+(loc-p)+1,b);
}
}
void PostOrderTraverse(BiTree T)
{
if(!T)
return;
else if(T!=NULL)
{
if(T->lchild!=NULL)
PostOrderTraverse(T->lchild);
if(T->rchild!=NULL)
PostOrderTraverse(T->rchild);
cout<<(T->data);
}
}
int main()
{
int p,q,loc;
cin>>s1>>s2;
BiTree T;
/*T=(BiTree) malloc(sizeof(BiNode));
T->data=s1[0];
*/
p=0;
q=s2.size();
BuildTree(T,p,q-1,p,q-1); //p为第一个字母下标,q为最后一个
PostOrderTraverse(T);
cout<<endl;
return 0;
}