zoukankan      html  css  js  c++  java
  • (二叉树 递归) leetcode 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.

    ----------------------------------------------------------------------------------------------------------------------------------

    这个是从先序遍历和后序遍历构建二叉树,不过却和之前的leetcode105 和 leetcode106的从中序遍历和先序遍历构建二叉树以及中序遍历和后序遍历构建二叉树不同的是,这个构建二叉树是不唯一的。另外,实现的代码和之前的两个题是也有一些不同。(注:关于这个怎么确定从先序遍历和后序遍历构建二叉树,可以看官方题解:https://leetcode.com/articles/construct-binary-tree-from-preorder-and-postorder-/  和另一个大佬的博客https://blog.csdn.net/waple_0820/article/details/81837875

    C++代码1:

    这个代码和leetcode 105 以及106的的用时20多ms的代码相比,添加了其中一个数组的长度(pre.size()),这样的会方便确定递归遍历时的终止点。不过有些代码是多余的。

    /**
     * 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) {
            return build(pre,0,pre.size()-1,post,0,pre.size() - 1,pre.size());
        }
        TreeNode* build(vector<int> &pre,int prel,int prer,vector<int> &post,int posl,int posr,int N){
            if(prel > prer || posl > posr) return NULL;
            if(N == 0)
                return NULL;
            TreeNode *cur = new TreeNode(pre[prel]);
            if(N == 1)
                return cur;
            int i = 1;
            for(i = 1; i < N; i++){
                if(pre[prel + 1] == post[posl + i - 1])
                    break;
            }
            cur->left = build(pre,prel + 1,prel + i,post,posl,posl + i - 1,i);
            cur->right = build(pre,prel + i + 1,prer,post,posl + i,posr-1,N-1-i);
            return cur;
        }
    };

    C++代码2:

    去除以上的多余的代码:build()里面的参数去掉了pre和post数组的末端的数的下标,不过保留了pre和post数组的长度,这个也会确定pre的末端的数的下标。

    /**
     * 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) {
            return build(pre,0,post,0,pre.size());
        }
        TreeNode* build(vector<int> &pre,int prel,vector<int> &post,int postl,int N){
            if(N == 0) return 0;
            TreeNode *cur = new TreeNode(pre[prel]);
            if(N == 1) return cur;
            int i = 1;
            for(i = 1; i < N; i++){
                if(pre[prel + 1] == post[postl + i - 1])
                    break;
            }
            cur->left = build(pre,prel + 1,post,postl,i);
            cur->right = build(pre,prel + i + 1,post,postl + i,N - 1 - i);
            return cur;
        }
    };

    C++代码3:

    和leetcode105和106的用时150ms以上的代码基本类似,就是 if(pre.size() == 1 || post.size() == 1) return cur;这个代码不能漏掉,这个是必须写上的递归的终止条件。还有,这个代码耗时比较少。。。。才20多ms。

    /**
     * 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) {
            return build(pre,post);
        }
        TreeNode* build(vector<int> &pre,vector<int> &post){
            if(pre.size() == 0 || post.size() == 0) return NULL;
            int rootval = pre[0];
            TreeNode *cur = new TreeNode(rootval);
            if(pre.size() == 1 || post.size() == 1) return cur;
            int i = 1;
            for(i = 1; i < pre.size(); i++){
                if(pre[1] == post[i - 1])
                    break;
            }
            vector<int> prel,prer,postl,postr;
            for(int k = 1; k <= i; k++){
                prel.push_back(pre[k]);
            }
            for(int k = i + 1; k < pre.size(); k++){
                prer.push_back(pre[k]);
            }
            for(int k = 0; k < i; k++){
                postl.push_back(post[k]);
            }
            for(int k = i; k < post.size() - 1; k++){
                postr.push_back(post[k]);
            }
            cur->left = build(prel,postl);
            cur->right = build(prer,postr);
            return cur;
        }
    };
  • 相关阅读:
    CodeForces
    CodeForces
    FZU
    FZU
    UESTC
    测试用例概述
    软件测试流程
    软件测试(二)软件测试过程
    软件测试(一)软件的生命周期(SDLC,Systems Development Life Cycle,SDLC)
    系统测试的策略
  • 原文地址:https://www.cnblogs.com/Weixu-Liu/p/10772892.html
Copyright © 2011-2022 走看看