甲级 1020 Tree Traversals

新知识
根据后序中序求前序
用遍历

学习了别人的代码

#include <cstdio>
using namespace std;
int post[] = {3, 4, 2, 6, 5, 1};
int in[] = {3, 2, 4, 1, 6, 5};
void pre(int root, int start, int end) {
    if(start > end) return ;
    int i = start;
    while(i < end && in[i] != post[root]) i++;
    printf("%d ", post[root]);
    pre(root - 1 - end + i, start, i - 1); //左子树
    pre(root - 1, i + 1, end); //右子树
}

int main() {
    pre(5, 0, 5);
    return 0;
}

start 是树开始的地方,end是树结束的地方, root是当前根,拿来输出
理解,,

这道题没有还原 原来的树 ,直接存到数组,然后输出
注意数组要开的够大,不然最后一个测试点会过不去
所以用vector比较好?

补充: vector resize是开了可以用的内存,reserve是开了但是还不能用,预存的。

#include <cstdio>
#include <iostream>
#include <cstdlib>
#include <cstring>

using namespace std;

int n;
int post[1000], in[1000], level[100000];

void pre(int root, int start, int end, int inde){
    if(start > end) return ;
    int i = start;
    while(i < end && in[i] != post[root] ) i++;
    level[inde] = post[root];
    pre(root-end+i-1,start,i-1,2*inde+1);
    pre(root-1,i+1,end,2*inde+2);
}

int main(){

    scanf("%d", &n);
    memset(level,-1,sizeof(level));
    int key = 0;
    for(int i=0; i<n; i++) scanf("%d",&post[i]);
    for(int i=0; i<n; i++) scanf("%d",&in[i]);
    pre(n-1,0,n-1,0);
    for(int i=0; i<sizeof(level); i++){
        if(level[i] != -1){
            if(i==0) printf("%d",level[i]);
            else printf(" %d",level[i]);
            key++;
        }
        if(key==n) break;

    }

    return 0;
}

猜你喜欢

转载自blog.csdn.net/mdzz_z/article/details/81429388
今日推荐