给定前序序列以及中序序列可以建立一棵静态二叉树。
如有前序序列 pre = (1, 2, 3, 4, 5, 6)。
中序序列 in = (3, 2, 4, 1, 6, 5)。
显然有后序序列 post = (3, 4, 2, 6, 5, 1)
下面给出算法:
void buildtree(int root, int st, int ed, int idx){
if(st > ed) return;
tree[idx] = pre[root];
int i = st;
while(i < ed && in[i] != pre[root]) i++;
buildtree(root + 1, st, i - 1, idx * 2 + 1);
buildtree(root + i - st + 1, i + 1, ed, idx * 2 + 2);
}
此时便建立了一棵静态二叉树,根节点为 0。 如果根节点要从1开始的话,idx 要相应的转变成 idx * 2, 与 idx *2 + 1。
顺便提一嘴,此静态二叉树若顺序遍历既是层序序列。
如果单纯的只想输出后序序列呢?
下面给出算法:
void post(int root, int start, int end){
if(start > end) return;
int i = start;
while(i < end && in[i] != pre[root]) i++;
post(root + 1, start, i - 1);
post(root + i - start + 1, i + 1, end);
if(cnt == 0){
cnt++;
printf("%d", pre[root]);
}else printf(" %d", pre[root]);
}
cnt 初值为0, 加上cnt 是为了控制输出,形成最后一位数后面没有空格 。
也可以进行存储,存储后再输出:
则变为:
void getpost(int root, int st, int ed){
if(st > ed) return;
int k = st;
while(k < ed && in[k] != pre[root]) k++;
findroot(root + 1, st, k - 1);
findroot(root + k - st + 1, k + 1, ed);
ans.push_back(pre[root]);
}