zoukankan      html  css  js  c++  java
  • Leetcode [654] 最大二叉树 &[105] 从前序与中序遍历序列构造二叉树 & [106] 从中序与后序遍历序列构造二叉树

     思路:

    labuladong手把手带你刷二叉树(第二期)

    按照题目给出的例子,输入的数组为[3,2,1,6,0,5],对于整棵树的根节点来说,其实在做这件事:

    TreeNode constructMaximumBinaryTree([3,2,1,6,0,5]) {
        // 找到数组中的最大值
        TreeNode root = new TreeNode(6);
        // 递归调用构造左右子树
        root.left = constructMaximumBinaryTree([3,2,1]);
        root.right = constructMaximumBinaryTree([0,5]);
        return root;
    }

    也就是找到数组中的最大值,创建root,然后分别递归左右部分

    class Solution {
    public:
        TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
            return build(nums,0,nums.size()-1);
        }
        TreeNode* build(vector<int>& nums, int lo,int hi) {
            if(lo>hi) return NULL;
            int index=lo;
            int max=nums[lo];
            for(int i=lo;i<=hi;++i){
                if(nums[i]>max){
                    index=i;
                    max=nums[i];
                }
            }
            TreeNode* root=new TreeNode(max);
            root->left=build(nums,lo,index-1);
            root->right=build(nums,index+1,hi);
            return root;
        }
    };
    [105] 从前序与中序遍历序列构造二叉树

     思路:

     前序遍历保证了preorder[0]就是根节点,然后可以根据根节点在inorder中找到对应位置,以此来确定左子树的长度和右子树的长度,返回到preorder中划分开左右子树。

    class Solution {
    public:
        TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
            TreeNode* node=sol(preorder,0,preorder.size()-1,inorder,0,inorder.size()-1);
            return node;
        }
        TreeNode* sol(vector<int>& preorder, int pl,int pr, vector<int>& inorder,int il,int ir)
        {
            if(pl>pr||il>ir)
                return NULL;
            int val=preorder[pl];
            int index=0;
            for(int i=il;i<=ir;++i){
                if(inorder[i]==val){
                    index=i;
                }
            }
            int left_len = index-il;
            int right_len = ir-index;
            TreeNode* root = new TreeNode(val);
            root->left=sol(preorder,pl+1,pl+left_len,inorder,il,index-1);
            root->right=sol(preorder,pl+left_len+1,pr,inorder,index+1,ir);
            return root;
        }
    };
    [106] 从中序与后序遍历序列构造二叉树

    思路:

    同上,后序遍历保证最后一位是根节点,然后到中序遍历中找到左右子树长度

    class Solution {
    public:
        TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
            TreeNode* res=sol(inorder,0,inorder.size()-1, postorder,0,postorder.size()-1);
            return res;
        }
        TreeNode *sol(vector<int>& inorder, int il,int ir, vector<int>& postorder,int pl,int pr)
        {
            if(il>ir||pl>pr)
                return NULL;
            int root=postorder[pr];
            int x=0;
            for(int i=il;i<=ir;++i)
            {
                if(root==inorder[i])
                {
                    x=i;
                    break;
                }
            }
            TreeNode* node=new TreeNode(root);
            TreeNode* left=sol(inorder,il,x-1,postorder,pl,pl+(x-il)-1);
            TreeNode* right=sol(inorder,x+1,ir,postorder,pl+(x-il),pr-1);
            node->left=left;
            node->right=right;
            return node;
        }
    };
    联系方式:emhhbmdfbGlhbmcxOTkxQDEyNi5jb20=
  • 相关阅读:
    ORACLE 使用笔记
    Python资源大全,让你相见恨晚的Python库
    基于python的k-s值计算
    sklearn聚类模型:基于密度的DBSCAN;基于混合高斯模型的GMM
    skearn学习路径
    透彻形象理解核函数
    LDA降维与PCA降维对比
    sklearn 岭回归
    GBDT、XGBOOST、LightGBM对比学习及调参
    sklearn,交叉验证中的分层抽样
  • 原文地址:https://www.cnblogs.com/zl1991/p/14859803.html
Copyright © 2011-2022 走看看