代码随想录第二十二天 | 654.最大二叉树, 617.合并二叉树, 700.二叉搜索树中的搜索, 98. 验证二叉搜索树

embedded/2024/9/25 12:47:01/

654.最大二叉树

看完想法:构造树一般采用的是前序遍历,因为先构造中间节点,然后递归构造左子树和右子树

确定递归函数的参数和返回值:返回TreeNode* 输入vector<int>& num; 确定终止条件:当输入数组大小=1的时候,传入数值;确定单层递归的逻辑:和之前的题目有一些相似

if的意义是保证左右区间至少有一个元素,如果没有就不执行了,缺少if,构造vector会报错

TreeNode* constructMaximumBinaryTree(vector<int>& nums) {//终止条件TreeNode* node = new TreeNode(0);if(nums.size() == 1){node->val = nums[0];return node;}//先找最大值,即根节点int maxValue = 0;int maxValueIndex = 0;for(int i=0; i<nums.size(); i++){if(maxValue < nums[i]){maxValue = nums[i];maxValueIndex = i;}}node->val = maxValue;if (maxValueIndex > 0) {vector<int> newVec(nums.begin(), nums.begin() + maxValueIndex);node->left = constructMaximumBinaryTree(newVec);}// 最大值所在的下标右区间 构造右子树// if的意义是保证左右区间至少有一个元素,如果没有就不执行了,缺少if,构造vector会报错if (maxValueIndex < (nums.size() - 1)) {vector<int> newVec(nums.begin() + maxValueIndex + 1, nums.end());node->right = constructMaximumBinaryTree(newVec);}return node;}

617.合并二叉树

看完想法:感觉还挺简单的,这里注意一下终止条件和递归的逻辑

TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {if(root1 == NULL) return root2;if(root2 == NULL) return root1;root1->val = root1->val + root2->val;root1->left = mergeTrees(root1->left, root2->left);root1->right = mergeTrees(root1->right, root2->right);return root1;}

700.二叉搜索树中的搜索

看完想法:要先注意什么是二叉搜索树,之前的基本知识里面有提到过:

  • 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
  • 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
  • 因为二叉搜索树的节点是有序的,所以可以有方向的去搜索。

  • 如果root->val > val,搜索左子树,如果root->val < val,就搜索右子树,最后如果都没有搜索到,就返回NULL。

    递归和迭代 都可以掌握以下

     TreeNode* searchBST(TreeNode* root, int val) {if(root == NULL || root->val == val) return root;TreeNode* result = NULL;if(root->val > val) result = searchBST(root->left, val);if(root->val < val) result = searchBST(root->right, val);return result;

    98. 验证二叉搜索树

    看完想法:如果是空节点 是不是二叉搜索树呢?是的,二叉搜索树也可以为空!最直观的解法是:把二叉树用中序遍历转为数组输出,然后遍历数组,看是不是单调递增的(等于的情况也不是二叉搜索树了)

    vector<int> vec;void traversal(TreeNode* root) {if (root == NULL) return;traversal(root->left);vec.push_back(root->val); // 将二叉搜索树转换为有序数组traversal(root->right);}
    public:bool isValidBST(TreeNode* root) {vec.clear(); // 不加这句在leetcode上也可以过,但最好加上traversal(root);for (int i = 1; i < vec.size(); i++) {// 注意要小于等于,搜索树里不能有相同元素if (vec[i] <= vec[i - 1]) return false;}return true;


http://www.ppmy.cn/embedded/44058.html

相关文章

Android Retrofit 封装模版

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、加上网络访问的权限二、引入依赖三、由API生成JavaBean四、封装Retrofit五、调用 一、加上网络访问的权限 <uses-permission android:name"android.p…

Nacos 微服务管理

Nacos 本教程将为您提供Nacos的基本介绍&#xff0c;并带您完成Nacos的安装、服务注册与发现、配置管理等功能。在这个过程中&#xff0c;您将学到如何使用Nacos进行微服务管理。下方是官方文档&#xff1a; Nacos官方文档 1. Nacos 简介 Nacos&#xff08;Naming and Confi…

LeetCode 63.不同路径Ⅱ

思路&#xff1a; 在有障碍物的地方增加一个判断即可 class Solution { public:int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {int dp[105][105];int mobstacleGrid.size();int nobstacleGrid[0].size();for(int i0;i<m;i){for(int j0…

网络应用层之(1)DHCPv6协议

网络应用层之(1)DHCPv6协议 Author: Once Day Date: 2024年5月26日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文章可参考专栏: 通信网络技术_Once-Day的博客-C…

Javascript 位运算符(,|,^,<<,>>,>>>)

文章目录 一、什么是位运算&#xff1f;二、如何使用1. 位与&#xff08;AND&#xff09;&#xff1a;&用途&#xff08;1&#xff09;数据清零&#xff08;2&#xff09;判断奇偶 2. 位或&#xff08;OR&#xff09;&#xff1a;|用途&#xff08;1&#xff09;向下取整 3…

前端基础入门三大核心之HTML篇 —— IndexedDB详解

前端基础入门三大核心之HTML篇 —— IndexedDB详解 什么是IndexedDB&#xff1f;为什么选择IndexedDB&#xff1f; 基本概念数据库&#xff08;Database&#xff09;对象仓库&#xff08;Object Store&#xff09;索引&#xff08;Index&#xff09;事务&#xff08;Transactio…

日志输出-第三章-接口级出入参输出完整数据的实现

文章目录 日志输出-第三章-接口级出入参输出完整数据的实现一、概述二、如何输出 Request 的 body2.1、工具类2.2、包装类2.3、如何使用 三、如何输出 Response 的 body3.1、包装类3.2、如何使用 日志输出-第三章-接口级出入参输出完整数据的实现 前置内容 日志输出指南日志输…

向npm发布自己写的vue组件,使用vite创建项目

向npm发布自己写的vue组件&#xff0c;使用vite创建项目 创建项目 pnpm create vite输入项目名称 由于我的组件是基于 ant-design-vue和vue的&#xff0c;需要解析.vue文件&#xff0c;我又安装了下面4个。 然后执行 pnpm i安装依赖 vite.config.ts import { defineC…