首页 > 其他 > 详细

889.Construct Binary Tree from Preorder and Postorder Traversal

时间:2018-10-25 10:41:23      阅读:166      评论:0      收藏:0      [点我收藏+]

Return any binary tree that matches the given preorder and postorder traversals.

Values in the traversals pre and post are distinct positive integers.

 

Example 1:

Input: pre = [1,2,4,5,3,6,7], post = [4,5,2,6,7,3,1]
Output: [1,2,3,4,5,6,7]

 

Note:

  • 1 <= pre.length == post.length <= 30
  • pre[] and post[] are both permutations of 1, 2, ..., pre.length.
  • It is guaranteed an answer exists. If there exists multiple answers, you can return any of them.

Runtime: 8 ms, faster than 98.12% of C++ online submissions for Construct Binary Tree from Preorder and Postorder Traversal.

#include<stdlib.h>
#include<vector>
#include<stack>
#include<queue>
#include <iostream>

using namespace std;

//Definition for a binary tree node.
struct TreeNode {
    int val;
    TreeNode *left;
    TreeNode *right;

    TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};

class Solution {
public:
    TreeNode *constructFromPrePost(vector<int> &pre, vector<int> &post) {
        if (pre.size() == 0) return nullptr;
        stack<TreeNode *> st;
        TreeNode *root = new TreeNode(pre[0]);
        st.push(root);
        int j = 0;
        int i = 0;
        TreeNode *node = nullptr;
        for(int i=1;i<pre.size();++i){
            while (st.top()->val == post[j]) {
                node = st.top();
                st.pop();
                printf("pop %d\n",node->val);
                if (st.top()->left == nullptr) {
                    st.top()->left = node;
                    printf("%d left child is %d\n", st.top()->val, node->val);
                } else {
                    st.top()->right = node;
                    printf("%d right child is %d\n", st.top()->val, node->val);
                }
                j++;
                printf("j: %d\n",j);
            }
            if (i < pre.size()){
                st.push(new TreeNode(pre[i]));
                printf("push %d\n",pre[i]);
            }
        }

        while (true) {
            node = st.top();
            st.pop();
            if(st.empty()) break;
            printf("pop %d\n",node->val);
            if (st.top()->left == nullptr) {
                st.top()->left = node;
                printf("%d left child is %d\n", st.top()->val, node->val);
            } else {
                st.top()->right = node;
                printf("%d right child is %d\n", st.top()->val, node->val);
            }
            j++;
            printf("j: %d\n",j);
        }
        return root;
//        printf("return\n");
//        printf("root->value %d\n",root->val);
//        return root;
    }
};

void show_tree(TreeNode *root) {
    if (root == nullptr) {
        cout<<"root is nullptr"<<endl;
        return;
    }
    cout<<"root is not nullptr"<<endl;
    queue<TreeNode *> qu;
    qu.push(root);
    int sz;
    while (!qu.empty()) {
        sz = qu.size();
        TreeNode* node= nullptr;
        for (int i = 0; i < sz; ++i) {
            node=qu.front();
            cout << node->val << " ";
            qu.pop();
            if (node->left)
                qu.push(node->left);
            if (node->right)
                qu.push(node->right);
        }
        cout << "\n";
    }
}

int main() {
    vector<int> pre{1, 2, 4, 5, 3, 6, 7};
    vector<int> post{4, 5, 2, 6, 7, 3, 1};
    Solution solution;
    TreeNode *res = solution.constructFromPrePost(pre, post);

//    solution.constructFromPrePost(pre, post);
    printf("res value %d\n",res->val);
    show_tree(res);
    return 0;

}

提交代码

class Solution {
public:
    TreeNode *constructFromPrePost(vector<int> &pre, vector<int> &post) {
        if (pre.size() == 0) return nullptr;
        stack<TreeNode *> st;
        TreeNode *root = new TreeNode(pre[0]);
        st.push(root);
        int j = 0;
        TreeNode *node = nullptr;
        for(int i=1;i<=pre.size();++i){
            while (st.top()->val == post[j]) {
                node = st.top();
                st.pop();
                //printf("pop %d\n",node->val);
                if(st.empty())
                    return root;
                if (st.top()->left == nullptr) {
                    st.top()->left = node;
                    //printf("%d left child is %d\n", st.top()->val, node->val);
                } else {
                    st.top()->right = node;
                    //printf("%d right child is %d\n", st.top()->val, node->val);
                }
                j++;
                //printf("j: %d\n",j);
            }
            if (i < pre.size()){
                st.push(new TreeNode(pre[i]));
                //printf("push %d\n",pre[i]);
            }
        }
    }
};

 

889.Construct Binary Tree from Preorder and Postorder Traversal

原文:https://www.cnblogs.com/learning-c/p/9847610.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!