leetcode 题解报告 最大二叉树系列

leetcode最大二叉树系列

654. 最大二叉树

给定一个不含重复元素的整数数组。一个以此数组构建的最大二叉树定义如下:

  • 二叉树的根是数组中的最大元素。
  • 左子树是通过数组中最大值左边部分构造出的最大二叉树。
  • 右子树是通过数组中最大值右边部分构造出的最大二叉树。
  • 通过给定的数组构建最大二叉树,并且输出这个树的根节点。
输入:[3,2,1,6,0,5]
输出:返回下面这棵树的根节点:

      6
    /   \
   3     5
    \    / 
     2  0   
       \
        1

题解:

思路很简单,先找最大值,然后左边放左子树右边放右子树,至于为什么要写一篇博客,,因为我感觉我迭代写的比递归好,所以我想试试递归的写法

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
    
    
public:
    TreeNode* construct(vector<int>&nums,int l,int r){
    
    
        int maxnum=l;
        if(l>r)
            return nullptr;
        for(int i=l+1;i<=r;++i){
    
    
            if(nums[i]>nums[maxnum])
                maxnum=i;
        }
        TreeNode* temp=new TreeNode(nums[maxnum]);
        temp->left=construct(nums,l,maxnum-1);
        temp->right=construct(nums,maxnum+1,r);
        return temp;
    }
    TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
    
    
        TreeNode* ans=construct(nums,0,nums.size()-1);
        return ans;
    }
};

998. 最大二叉树 II

最大树定义:一个树,其中每个节点的值都大于其子树中的任何其他值。

给出最大树的根节点 root。

就像之前的问题那样,给定的树是从表 A(root = Construct(A))递归地使用下述 Construct(A) 例程构造的:

  • 如果 A 为空,返回 null
  • 否则,令 A[i] 作为 A 的最大元素。创建一个值为 A[i] 的根节点 root
  • root 的左子树将被构建为 Construct([A[0], A[1], …, A[i-1]])
  • root 的右子树将被构建为 Construct([A[i+1], A[i+2], …, A[A.length - 1]])
  • 返回 root

请注意,我们没有直接给定 A,只有一个根节点 root = Construct(A).

假设 B 是 A 的副本,并附加值 val。保证 B 中的值是不同的。

返回 Construct(B)。

题解:

这道题就是上道题的变形,在尾部插入一值,让你重新构造这棵树,我这里想成搜索树了,想了半天。容易踩坑

(ps:递归的代码是真的简单啊…)

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
    
    
public:
    TreeNode* insertIntoMaxTree(TreeNode* root, int val) {
    
    
        if(val>=root->val){
    
    
            root=new TreeNode(val,root,nullptr);
        }
        else {
    
    
            if(root->right==nullptr)
                root->right=new TreeNode(val);
            else
                root->right=insertIntoMaxTree(root->right,val);
        }
        return root;
    }
};

猜你喜欢

转载自blog.csdn.net/qq_43477024/article/details/111939576