leetcode654最大二叉树刷题打卡

简介: leetcode654最大二叉树刷题打卡
654. 最大二叉树

题目描述

给定一个不重复的整数数组 nums 最大二叉树 可以用下面的算法从 nums 递归地构建:

  • 创建一个根节点,其值为 nums 中的最大值。
  • 递归地在最大值 左边子数组前缀上 构建左子树。
  • 递归地在最大值 右边子数组后缀上 构建右子树。

返回 nums 构建的 最大二叉树

题解思路

  • 我首先写了一个方法,是找最大值及其下标索引的方法,参数有数组和左右下标,根据下标给出的范围来找这个范围中的最大值,代码如下
pair<int,int> findmax(vector<int> nums, int low, int high){
        int temp = INT_MIN;
        int index = 0;
        for(int i = low; i < high; i++){
            if(temp < nums[i]) {
                temp = nums[i];
                index = i;
            } 
        }
        return {temp,index};
    }
  • INT_MIN放在**<limit>**头文件中,其中还有INT_MAX可用
  • 接下来就是递归的部分
  • 遇见递归就要想到三步:
  • 确定参数和返回值
  • 参数会放一个数组和前后下标,这道题递归的核心就是如何来分割数组,我就用下标来分割数组,返回值返回TreeNode*,这样**“主函数”**就可以来接收
  • reeNode* travesal(vector<int> & nums, int low, int high);
  • 确定终止条件
  • 终止条件有俩,一是一来就确定给定的范围是否为空
  • if(high == low) return nullptr;
  • 在范围不为空的情况下,在根节点建立后判断该节点是否为叶子节点,如果是,提前返回根节点,不用执行之后的分割操作
  • if(high - low == 1) return root;
  • 确定本层逻辑
  • 首先找到给定范围下的最大值,然后创建根节点
pair<int,int> maxAndindex= findmax(nums, low, high);
TreeNode* root = new TreeNode(maxAndindex.first);
  • 然后利用最大值找到切割点并且进行切割操作
int sub = maxAndindex.second;
int lowleft = low;
int lowright = sub;
int highleft = sub + 1;
int highright = high;
  • 最后左右子树的构造就交给递归
root->left = travesal(nums, lowleft, lowright);
root->right = travesal(nums, highleft, highright);

完整代码

class Solution {
public:
    pair<int,int> findmax(vector<int> nums, int low, int high){
        int temp = INT_MIN;
        int index = 0;
        for(int i = low; i < high; i++){
            if(temp < nums[i]) {
                temp = nums[i];
                index = i;
            } 
        }
        return {temp,index};
    }
    TreeNode* travesal(vector<int> & nums, int low, int high){
        if(high == low) return nullptr;
        pair<int,int> maxAndindex= findmax(nums, low, high);
        TreeNode* root = new TreeNode(maxAndindex.first);
        if(high - low == 1) return root;
        int sub = maxAndindex.second;
        int lowleft = low;
        int lowright = sub;
        int highleft = sub + 1;
        int highright = high;
        root->left = travesal(nums, lowleft, lowright);
        root->right = travesal(nums, highleft, highright);
        return root;
    }
    TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
        return travesal(nums, 0, nums.size());
    }
};

简洁高效版本

class Solution {
public:
    TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
        return buildTree(nums,0,nums.size());
    }
    TreeNode* buildTree(vector<int>& nums,int l, int r)
    {
        if(l == r) return nullptr;
        int maxVal = INT_MIN;
        int index = 0;
        for(int i = l ;i < r ; i++)
        {
            if(maxVal < nums[i])
            {
                maxVal = nums[i];
                index = i;
            }
        }
        TreeNode* head = new TreeNode(maxVal);
        if(r - l == 1) return head;
        head->left = buildTree(nums,l,index);
        head->right = buildTree(nums,index + 1,r);
        return head;
    }
};

优雅版本——操作迭代器

  • 利用了头文件<algorithm>的泛型算法max_element ,返回最大值代表的迭代器
class Solution {
public:
    TreeNode* travesal(vector<int> & nums, vector<int>::iterator left, vector<int>::iterator right){
        if(right == left) return nullptr;
        auto it = max_element(left, right);
        TreeNode* root = new TreeNode(*it);  //解引用就是值,本身就是位置
        if(right - left == 1) return root;        
        root->left = travesal(nums, left, it);
        root->right = travesal(nums, it + 1, right);
        return root;
    }
    TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
        return travesal(nums, nums.begin(), nums.end());
    }
};


相关文章
|
13天前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
41 2
|
4天前
|
存储 算法
二叉树进阶-学会层序遍历助你一次刷完leetcode10道题
文章深入探讨了二叉树的层序遍历方法,并展示了如何通过队列实现层序遍历的算法逻辑,同时指出掌握层序遍历技巧可以帮助解决LeetCode上的多道相关题目。
二叉树进阶-学会层序遍历助你一次刷完leetcode10道题
|
4天前
|
算法 Java
LeetCode第94题二叉树的中序遍历
文章介绍了LeetCode第94题"二叉树的中序遍历"的解法,使用递归实现了中序遍历的过程,遵循了"左根右"的遍历顺序,并提供了清晰的Java代码实现。
LeetCode第94题二叉树的中序遍历
|
13天前
|
算法 Python
【Leetcode刷题Python】 LeetCode 2038. 如果相邻两个颜色均相同则删除当前颜色
本文介绍了LeetCode 2038题的解法,题目要求在一个由'A'和'B'组成的字符串中,按照特定规则轮流删除颜色片段,判断Alice是否能够获胜,并提供了Python的实现代码。
25 3
|
13天前
|
算法 Python
【Leetcode刷题Python】剑指 Offer 33. 二叉搜索树的后序遍历序列
本文提供了一种Python算法,用以判断给定整数数组是否为某二叉搜索树的后序遍历结果,通过识别根节点并递归验证左右子树的值是否满足二叉搜索树的性质。
11 3
|
13天前
|
Python
【Leetcode刷题Python】50. Pow(x, n)
本文介绍了LeetCode第50题"Pow(x, n)"的解法,题目要求实现计算x的n次幂的函数,文章提供了递归分治法的详细解析和Python实现代码。
11 1
|
13天前
|
Python
【Leetcode刷题Python】LeetCode 478. 在圆内随机生成点
本文介绍了LeetCode 478题的解法,题目要求在给定圆的半径和圆心位置的情况下实现在圆内均匀随机生成点的功能,并提供了Python的实现代码。
12 1
|
13天前
|
算法 Python
【Leetcode刷题Python】295. 数据流的中位数
本文介绍了一种使用Python实现的数据结构,用以支持数据流中添加整数并返回当前所有元素的中位数,通过排序列表来计算中位数。
9 1
|
13天前
|
算法 Python
【Leetcode刷题Python】73. 矩阵置零
本文介绍了LeetCode第73题的解法,题目要求在给定矩阵中将所有值为0的元素所在的行和列全部置为0,并提供了一种原地算法的Python实现。
13 0
【Leetcode刷题Python】73. 矩阵置零
|
11天前
|
存储 算法 Java
LeetCode经典算法题:二叉树遍历(递归遍历+迭代遍历+层序遍历)以及线索二叉树java详解
LeetCode经典算法题:二叉树遍历(递归遍历+迭代遍历+层序遍历)以及线索二叉树java详解
31 0