首页 > 编程语言 >代码随想录算法训练营第二十天 | 654.最大二叉树 617.合并二叉树 二叉搜索树

代码随想录算法训练营第二十天 | 654.最大二叉树 617.合并二叉树 二叉搜索树

时间:2024-06-02 18:12:27浏览次数:26  
标签:return val 随想录 654 二叉树 ans TreeNode root left

654.最大二叉树

题目链接 文章讲解 视频讲解

class Solution {
public:
    TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
        return inorderTraversal(nums, 0, nums.size() - 1);
    }
    TreeNode* inorderTraversal(vector<int>& nums, int begin, int end) {
        if(begin > end) return nullptr;
        // 查找最大值,构造根节点
        int maxValueIndex = findMax(nums, begin, end);
        TreeNode * root = new TreeNode(nums[maxValueIndex]);
        // 先序遍历最区间构造左子树
        root->left = inorderTraversal(nums, begin, maxValueIndex - 1);
        // 先序遍历有区间构造右子树
        root->right = inorderTraversal(nums, maxValueIndex + 1, end);
        return root;
    }
    // 查找最大值
    int findMax(vector<int>& nums, int left, int right) {
        int idx = left;
        while(left <= right) {
            if(nums[idx] < nums[left]) idx = left;
            ++left;
        }
        return idx;
    }
};

617.合并二叉树

题目链接 文章讲解 视频讲解

class Solution {
public:
    TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {
        if(root1 == nullptr) return root2; // 如root1为nullptr,则合并之后时root2,如果root2也为nullptr那么合并之后为nullptr
        if(root2 == nullptr) return root1;
        root1->val += root2->val;
        root1->left = mergeTrees(root1->left, root2->left);
        root1->right = mergeTrees(root1->right, root2->right);

        return root1;
    }
};

700.二叉搜索树中的搜索

题目链接 文章讲解 视频讲解

class Solution {
public:
    TreeNode* searchBST(TreeNode* root, int val) {
        if(root == nullptr) return nullptr;
        TreeNode* ans = nullptr;
        if(root->val == val) ans = root;
        if(root->val > val) ans = searchBST(root->left, val);
        if(root->val < val) ans = searchBST(root->right, val);
        return ans;
    }
};

98.验证二叉搜索树

题目链接 文章讲解 视频讲解

方法一

中序遍历二叉搜索树,如果生成的数组有序则二叉树为二叉搜索树

class Solution {
public:
    bool isValidBST(TreeNode* root) {
        vector<int> ans;
        preorderTraversal(root, ans);
        // 判断数组是否有序
        for(int i = 0; i < ans.size() - 1; ++i) {
            if(ans[i] >= ans[i+1]) return false;
        }
        return true;
    }
    // 中序遍历二叉搜索树,构造有序数组;
    void preorderTraversal(TreeNode* root, vector<int>& ans) {
        if(root == nullptr) return;
        preorderTraversal(root->left, ans);
        ans.push_back(root->val);
        preorderTraversal(root->right, ans);
    }
};

方法二

不构造数组,而使用一个maxValue来记录当前值的前一个值

class Solution {
private:
    long long maxValue = LONG_MIN;
public:
    bool isValidBST(TreeNode* root) {
        if(root == nullptr) return true;
        // 先序遍历左子树
        bool left = isValidBST(root->left);
        // 如果当前值比前一个值小则retun false;
        if(root->val > maxValue) {
            maxValue = root->val;
        } else {
            return false;
        }
        // 先序遍历右子树
        bool right = isValidBST(root->right);
        return left && right;
    }
};

标签:return,val,随想录,654,二叉树,ans,TreeNode,root,left
From: https://www.cnblogs.com/cscpp/p/18227416

相关文章

  • 代码随想录算法训练营第第25天 | 216.组合总和III 、17.电话号码的字母组合
    今天的题比较简单,重点是在于剪枝216.组合总和III如果把组合问题理解了,本题就容易一些了。题目链接/文章讲解:https://programmercarl.com/0216.组合总和III.html视频讲解:https://www.bilibili.com/video/BV1wg411873x/***@param{number}k*@param{number}n*@retu......
  • 二叉树链式结构的前序、中序、后序、层序遍历
    文章目录一、二叉树创建二、前序遍历概念以及解释代码三、中序遍历概念及解释代码四、后序遍历概念及解释代码五、层序遍历概念及解释代码一、二叉树创建&mesp; 实现二叉树的遍历,我们要先手搓出一个二叉树,在次基础上实现二叉树的前序、中序、后序、层序遍历。......
  • 【数据结构】二叉树-堆(下)-链式二叉树
    个人主页~二叉树-堆(上)栈和队列二叉树四、堆的代码实现Heap.hHeap.ctest.c五、堆的应用堆排序思想进行排序六、二叉树链式结构的实现BTree.hBTree.ctest.c四、堆的代码实现Heap.h#pragmaonce#include<stdio.h>#include<stdlib.h>#include<assert.h>......
  • 【数据结构】二叉树
    【数据结构】二叉树树树的概念树的相关概念树的注意事项左孩子右兄弟表示法树实际中的应用二叉树二叉树的概念二叉树的注意事项特殊二叉树满二叉树完全二叉树二叉树的性质二叉树的存储形式顺序存储链式存储二叉树链式结构简单初始化二叉树的遍历前序遍历中序遍历后续......
  • 代码随想录算法训练营第第24天 | 回溯法、77.组合问题
    一、回溯法回溯法是一种搜索方式,也是递归的副产品。只要有递归就会有回溯回溯法并不是什么高效的算法。因为回溯的本质是穷举,穷举所有可能,然后选出我们想要的答案,如果想让回溯法高效一些,可以加一些剪枝的操作,但也改不了回溯法就是穷举的本质。回溯法,一般可以解决如下几种问题......
  • 【LeetCode算法】第101题:对称二叉树
    目录一、题目描述二、初次解答三、官方解法四、总结一、题目描述二、初次解答1.思路:递归判定左子树和右子树是否对称。用一个新函数sym来递归判定左子树和右子树是否对称。该函数细节:判定当前传入的两个根节点是否为空,若均为空则返回true,若只有其中一个为空则返回fa......
  • 代码随想录算法训练营第四十五天 | 1049. 最后一块石头的重量 II、494. 目标和、474.
    1049.最后一块石头的重量II视频讲解:动态规划之背包问题,这个背包最多能装多少?LeetCode:1049.最后一块石头的重量II_哔哩哔哩_bilibili代码随想录解题思路直接将这一些石头,分为两堆,让他们尽可能相似,然后再相撞,就是最小值1.dp[j]背包容量为j所背的最大价值2.dp[......
  • 代码随想录算法训练营day10(栈与队列)
    代码随想录算法训练营day10(栈与队列):学习内容:std::queue和std::stack是C++标准库中提供的队列和栈的容器适配器,它们分别基于队列和栈的概念,提供了一组简单的操作接口。std::queuestd::queue是一个先进先出(FIFO)的队列容器适配器。它提供了队列的基本操作,包括入队(pus......
  • 60天【代码随想录算法训练营34期】第十章 单调栈part03 (84.柱状图中最大的矩形)
    84.柱状图中最大的矩形classSolution:deflargestRectangleArea(self,heights:List[int])->int:s=[0]result=0heights.insert(0,0)heights.append(0)foriinrange(1,len(height......
  • 【二叉树】Leetcode 129. 求根节点到叶节点数字之和【中等】
    求根节点到叶节点数字之和给你一个二叉树的根节点root,树中每个节点都存放有一个0到9之间的数字。每条从根节点到叶节点的路径都代表一个数字:例如,从根节点到叶节点的路径1->2->3表示数字123。计算从根节点到叶节点生成的所有数字之和。叶节点是指没有......