889.Construct Binary Tree from Preorder and Postorder Traversal

Posted learning-c

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了889.Construct Binary Tree from Preorder and Postorder Traversal相关的知识,希望对你有一定的参考价值。

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
",node->val);
                if (st.top()->left == nullptr) {
                    st.top()->left = node;
                    printf("%d left child is %d
", st.top()->val, node->val);
                } else {
                    st.top()->right = node;
                    printf("%d right child is %d
", st.top()->val, node->val);
                }
                j++;
                printf("j: %d
",j);
            }
            if (i < pre.size()){
                st.push(new TreeNode(pre[i]));
                printf("push %d
",pre[i]);
            }
        }

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

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
",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
",node->val);
                if(st.empty())
                    return root;
                if (st.top()->left == nullptr) {
                    st.top()->left = node;
                    //printf("%d left child is %d
", st.top()->val, node->val);
                } else {
                    st.top()->right = node;
                    //printf("%d right child is %d
", st.top()->val, node->val);
                }
                j++;
                //printf("j: %d
",j);
            }
            if (i < pre.size()){
                st.push(new TreeNode(pre[i]));
                //printf("push %d
",pre[i]);
            }
        }
    }
};

 

以上是关于889.Construct Binary Tree from Preorder and Postorder Traversal的主要内容,如果未能解决你的问题,请参考以下文章

(二叉树 递归) leetcode 889. Construct Binary Tree from Preorder and Postorder Traversal

[LeetCode] 889. Construct Binary Tree from Preorder and Postorder Traversal 由先序和后序遍历建立二叉树

Binary Tree和Binary Search Tree

[Leetcode] Binary tree-- 606. Construct String from Binary Tree

[Leetcode] Binary search tree --Binary Search Tree Iterator

[数据结构]Binary_tree | Binary_search_tree | avl_tree