1020 Tree Traversals (25分) PAT

看起来复杂,其实实现还是比较简单的。

先用递归建树,然后用队列实现输出。下面的代码样例中忘了delete。

#include<cstdio>
#include<queue>

using namespace std;

#define maxn 35

struct node {
    int data;
    node *left, *right;
};

node* maketree(int postorder[], int postLeft, int postRight,
               int inorder[], int inLeft, int inRight) {
    if (postLeft >= postRight) {
        return NULL;
    }
    node *root = new node;
    root->data = postorder[postRight - 1];
    root->left = NULL;
    root->right = NULL;
    int i;
    for (i = inLeft; i < inRight; i++) {
        if (root->data == inorder[i]) break;
    }
    int leftCount = i - inLeft;
    root->left = maketree(postorder, postLeft, postLeft + leftCount, inorder, inLeft, i);
    root->right = maketree(postorder, postLeft + leftCount, postRight - 1, inorder, i + 1, inRight);
    return root;
}

void print(node *root, int N) {
    queue<node*> q;
    if (root == NULL) {
        printf("no one\n");
        return;
    }
    q.push(root);
    int count = 0;
    node* temp;
    while(!q.empty()) {
        temp = q.front();
        q.pop();
        printf("%d", temp->data);
        count++;
        if (count < N) printf(" ");
        else printf("\n");

        if (temp->left != NULL) q.push(temp->left);
        if (temp->right != NULL) q.push(temp->right);
    }
}

int main() {
    int postorder[maxn], inorder[maxn];
    int N;
    scanf("%d", &N);
    for (int i = 0; i < N; i++) {
        scanf("%d", &postorder[i]);
    }
    for (int i = 0; i < N; i++) {
        scanf("%d", &inorder[i]);
    }
    node *root = maketree(postorder, 0, N, inorder, 0, N);
    print(root, N);

    return 0;
}
发布了17 篇原创文章 · 获赞 0 · 访问量 2444

猜你喜欢

转载自blog.csdn.net/Ike_Lin/article/details/104492736