首先需要说明的是,网上不知道为什么很多误传,说给定前序、中序和后序中的两个,可以唯一确定另一个,显然这是错误的。给定前序和后序,是无法确定中序的,一个最简单的例子就是只有两个节点的树,前序和后序给定,中序无法确定。
代码如下:
/*
* Copyright (c) 2014
* All Rights Reserved.
* author: laohaizi
*/
#include <iostream>
#include <string>
#include <string.h>
#include <stdio.h>
using namespace std;
typedef struct _NODE
{
char name;
struct _NODE *left,*right;
}NODE;
char *preorder="abcdefg";
char *inorder="cbedagf";
//char *inorder="abcdefg";
char *postorder="cedbgfa";
const int preorder_len = strlen(preorder);
const int inorder_len = strlen(inorder);
const int postorder_len = strlen(postorder);
NODE * PostOrder(char *preorder, int prebeg, int preend, char *inorder, int inbeg, int inend)
{
if (prebeg > preend || inbeg > inend || prebeg >= preorder_len || inbeg >= inorder_len || preend < 0 || inend < 0)
{
return NULL;
}
NODE *p = new NODE;
p->name = preorder[prebeg];
int k = 0;
int cnt = 0;
for (k = inbeg; k <= inend; ++k)
{
cnt ++;
if (inorder[k] == preorder[prebeg])
{
break;
}
}
p->left = PostOrder(preorder,prebeg+1,prebeg+cnt-1,inorder,inbeg,k-1);
p->right = PostOrder(preorder,prebeg+cnt,preend,inorder,k+1,inend);
return p;
}
NODE * PreOrder(char *postorder, int postbeg, int postend, char *inorder, int inbeg, int inend)
{
if (postbeg > postend || inbeg > inend || postbeg >= postorder_len || inbeg >= inorder_len || postend < 0 || inend < 0)
{
return NULL;
}
NODE *p = new NODE;
p->name = postorder[postend];
int k = 0;
int cnt = 0;
for (k = inbeg; k <= inend; ++k)
{
cnt ++;
if (inorder[k] == postorder[postend])
{
break;
}
}
p->left = PreOrder(postorder,postbeg,postbeg+cnt-2,inorder,inbeg,k-1);
p->right = PreOrder(postorder,postbeg+cnt-1,postend-1,inorder,k+1,inend);
return p;
}
int NodeNum(NODE *p)
{
if (p == NULL)
return 0;
return NodeNum(p->left)+NodeNum(p->right)+1;
}
void PostorderTraverse(NODE *p)
{
if(p != NULL)
{
PostorderTraverse(p->left);
PostorderTraverse(p->right);
cout<<p->name;
}
}
void PreorderTraverse(NODE *p)
{
if(p != NULL)
{
cout<<p->name;
PreorderTraverse(p->left);
PreorderTraverse(p->right);
}
}
int main()
{
//get postorder
NODE *root = PostOrder(preorder,0,preorder_len-1,inorder,0,inorder_len-1);
int nodenum = NodeNum(root);
if (nodenum != preorder_len)
{
cout<<"post order not exist."<<endl;
return 0;
}
cout<<"post order: ";
PostorderTraverse(root);
cout<<endl;
//get preorder
root = PreOrder(postorder,0,postorder_len-1,inorder,0,inorder_len-1);
nodenum = NodeNum(root);
if (nodenum != postorder_len)
{
cout<<"pre order not exist."<<endl;
//return 0;
}
cout<<"pre order: ";
PreorderTraverse(root);
cout<<endl;
return 0;
}