码迷,mamicode.com
首页 > 其他好文 > 详细

889.Construct Binary Tree from Preorder and Postorder Traversal

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

标签:multi   The   include   size   output   empty   can   stream   void   

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

标签:multi   The   include   size   output   empty   can   stream   void   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!