方法呢,与前一篇一样,建树或者不建树皆可,这里不做过多说明,直接show code。
WAY 1.
typedef struct TreeNode *BinTree;
struct TreeNode{
char key;
BinTree left;
BinTree right;
TreeNode(char _key):key(_key), left(NULL), right(NULL){}
};
BinTree buildTree(char *post, char *in, int n)
{
if(n == 0) return NULL;
BinTree node = new TreeNode(post[n - 1]); //注意后序序列中最后一个才是根节点
int i;
for(i = 0; i < n && in[i] != post[n - 1]; ++i) //确定根节点在中序序列中的位置
;
int lenLeft = i, lenRight = n - i - 1; //根节点左右子树的节点数
node->left = buildTree(post, in, lenLeft); //注意传递的参数
node->right = buildTree(post + lenLeft, in + lenLeft + 1, lenRight);
return node;
}
WAY 2.
const int maxn = 100;
char pre[maxn], in[maxn], post[maxn];
/*
call: toPreSeq(0, 0, 0, strlen(post));
*/
void toPreSeq(int postIndex, int inIndex, int preIndex, int n)
{
if(n == 0) return;
if(n == 1){
pre[preIndex] = post[postIndex];
return;
}
char root = post[postIndex + n - 1];
int i;
pre[preIndex] = root;
for(i = 0; i < n && in[inIndex + i] != root; ++i)
;
int lenLeft = i, lenRight = n - i - 1;
toPreSeq(postIndex, inIndex, preIndex + 1, lenLeft); //注意传参
toPreSeq(postIndex + lenLeft, inIndex + lenLeft + 1, preIndex + lenLeft + 1, lenRight);
}
note: 此算法正确的前提是保证后序中序序列正确。