參考的別人的代碼,用遞歸先建立左子樹,再建立右子樹,遞歸的代碼很簡練,但是並不好理解,
先記爲模板,以後回過頭來也許也會不一樣的發現。
#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;
}