要恢复一个二叉树,必须要有一个中序。
利用后序得到根,再根据中序将树分成左右两份。然后递归地调用即可。
参考代码:
注意:此代码未对后序与中序的字符串有效性进行检查。
#include<iostream>
using namespace std;
struct Node
{
char value;
Node * left;
Node * right;
};
Node * reconstruct(const char *postOrder, int pstart, int pend, const char *midOrder, int mstart, int mend)
{
if(postOrder==NULL || midOrder==NULL)
return NULL;
if(pstart==pend)
{
Node *n=new Node;
n->value=postOrder[pstart];
n->right=NULL;
n->left=NULL;
return n;
}
else
{
Node *n=new Node;
n->value=postOrder[pend];
char c=postOrder[pend];
int i=mstart;
while(midOrder[i]!=c)
i++;
int len=i-mstart;
n->left=reconstruct(postOrder,pstart,pstart+len-1,midOrder,mstart,mstart+len-1);
n->right=reconstruct(postOrder,pstart+len,pend-1,midOrder,mstart+len+1,mend);
return n;
}
}
void zhong_xu(Node *root)
{
if(root!=NULL)
{
if(root->left)
zhong_xu(root->left);
cout<<" "<<root->value<<" ";
if(root->right)
zhong_xu(root->right);
}
}
void xian_xu(Node *root)
{
if(root!=NULL)
{
cout<<root->value<<" ";
if(root->left)
xian_xu(root->left);
if(root->right)
xian_xu(root->right);
}
}
int main()
{
const char*post="debfgca";
const char *mid="dbeafcg";
Node* root =reconstruct(post,0,6,mid,0,6);
zhong_xu(root);
cout<<endl;
xian_xu(root);
return 0;
}