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

news/2024/9/22 22:42:30/

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/news/1464295.html

相关文章

vs2013使用qt Linguist以及tr不生效问题

一、qt Linguist&#xff08;语言家&#xff09;步骤流程 1、创建翻译文件,在qt选项中 2.选择对应所需的语言&#xff0c;得到.ts后缀的翻译文件 3.创建.pro文件&#xff0c;并将.ts配置在.pro文件中 3.使用qt Linguist 打开创建好的以.ts为后缀的翻译文件&#xff0c;按图所示…

产品经理-需求收集(二)

1. 什么是需求 指在一定的时期中&#xff0c;一定场景中&#xff0c;无论是心理上还是生理上的&#xff0c;用户有着某种“需要”&#xff0c;这种“需要”用户自己不一定知道的&#xff0c;有了这种“需要”后用户就有做某件事情的动机并促使达到其某种目的&#xff0c;这也就…

虹科Pico汽车示波器 | 免拆诊断案例 | 2012 款雪佛兰科鲁兹车偶尔多个故障灯异常点亮

故障现象 一辆2012款雪佛兰科鲁兹车&#xff0c;搭载1.8 L 发动机&#xff0c;累计行驶里程约为9.6万km。该车组合仪表上的发动机故障灯、ABS故障灯及动力转向故障灯偶尔异常点亮&#xff0c;同时发动机转速表和发动机冷却液温度表的指针会突然归零&#xff0c;严重时发动机无…

【区块链】fisco网络运维之添加节点黑名单

基于已完成的区块链系统与管理平台搭建工作&#xff0c;开展区块链节点的黑名单工作&#xff0c;具体操作如下 以node3为例子 1查看node0节点的连接状态日志&#xff08;现有4个节点连接&#xff09; 注意&#xff1a;如果查询不到连接状态&#xff0c;修改node0的配置文件中…

使用Java Swing制作一个飞翔的小鸟游戏

文章目录 一、需求分析二、技术介绍2.1相关技术2.2开发环境 三、功能实现1、开始2、运动3、死亡 四、部分代码实现获取源码 文章最下方获取源码&#xff01;&#xff01;&#xff01; 文章最下方获取源码&#xff01;&#xff01;&#xff01; 文章最下方获取源码&#xff01;&…

字节跳动(校招)算法原题

大模型"价格战"越演越烈 昨天的 文章 提到&#xff0c;自从 5 月 15 号&#xff0c;字节跳动发布了击穿行业底价的豆包大模型后&#xff0c;各大厂家纷纷跟进降价&#xff0c;而且都不是普通降价&#xff0c;要么降价 90% 以上&#xff0c;要么直接免费。 今天是豆包…

ECMAScript 详解

ECMAScript 详解 ECMAScript&#xff08;ES&#xff09;是JavaScript的标准化脚本语言&#xff0c;由ECMA国际通过ECMA-262标准进行规范。ECMAScript定义了语法、类型、对象模型和内置对象等基本特性&#xff0c;是JavaScript、JScript和ActionScript等语言的核心部分。 以下…

Stream流模式通信及示例

Stream流模式通信是指在计算机网络中&#xff0c;数据作为连续的字节流传输而不是独立的数据包。它是一种面向连接的通信方式&#xff0c;常见于TCP&#xff08;传输控制协议&#xff09;。以下是Stream流模式通信的基本概念和一个简单的示例。 基本概念 面向连接&#xff1…