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;
        }
    };
  • 相关阅读:
    中金所金融业务知识学习笔记(含股指期货、股指期权、国债期货)
    人工智能中小样本问题相关的系列模型演变及学习笔记(四):知识蒸馏、增量学习
    人工智能中小样本问题相关的系列模型演变及学习笔记(三):迁移学习、深度迁移学习
    人工智能中小样本问题相关的系列模型演变及学习笔记(二):生成对抗网络 GAN
    人工智能中小样本问题相关的系列模型演变及学习笔记(一):元学习、小样本学习
    行业知识图谱的构建及应用
    Verilog代码和FPGA硬件的映射关系(一)
    FPGA内部硬件结构简介
    Altera的Cyclone系列器件命名规则
    学会使用Hdlbits网页版Verilog代码仿真验证平台
  • 原文地址:https://www.cnblogs.com/Weixu-Liu/p/10772892.html
Copyright © 2011-2022 走看看