参考的别人的代码,用递归先建立左子树,再建立右子树,递归的代码很简练,但是并不好理解,
先记为模板,以后回过头来也许也会不一样的发现。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
struct node
{
char key;
node *lchild;
node *rchild;
};
//已知前序遍历与中序遍历建树,len为节点个数。
node* preMidCreateTree(char *pre, char *mid, int len)
{
char rootKey = pre[0];
node* root = new node;
root->key = rootKey;
root->lchild = root->rchild = NULL;
if(len==1 && *pre==*mid)
return root;
char* rootMidOrder=mid;
int rootIndex=0;
while(*rootMidOrder!=rootKey&&rootMidOrder<=(mid+len-1))
{
++rootMidOrder;
++rootIndex;
}
if(rootIndex>0)
{
root->lchild=preMidCreateTree(pre+1,mid,rootIndex);
}
if(len-rootIndex-1>0)
{
root->rchild=preMidCreateTree(pre+rootIndex+1,rootMidOrder+1,len-rootIndex-1);
}
return root;
}
//后序遍历输出
void postOrderTraverse(node* root)
{
if(root==NULL)
return;
postOrderTraverse(root->lchild);
postOrderTraverse(root->rchild);
cout<<root->key;
}
int main()
{
char pre[1000], mid[1000];
gets(pre);
gets(mid);
int len = strlen(pre);
node * root = preMidCreateTree(pre, mid, len);
postOrderTraverse(root);
cout<<""<<endl;
return 0;
}