day 20 二叉树 part05

news/2024/12/21 20:31:58/

654.最大二叉树

注意类似用数组构造二叉树的题目,每次分隔尽量不要定义新的数组,而是通过下标索引直接在原数组上操作,这样可以节约时间和空间上的开销。

题目链接/文章讲解:代码随想录

lass Solution {
private:// 在左闭右开区间[left, right),构造二叉树TreeNode* traversal(vector<int>& nums, int left, int right) {if (left >= right) return nullptr;// 分割点下标:maxValueIndexint maxValueIndex = left;for (int i = left + 1; i < right; ++i) {if (nums[i] > nums[maxValueIndex]) maxValueIndex = i;}TreeNode* root = new TreeNode(nums[maxValueIndex]);// 左闭右开:[left, maxValueIndex)root->left = traversal(nums, left, maxValueIndex);// 左闭右开:[maxValueIndex + 1, right)root->right = traversal(nums, maxValueIndex + 1, right);return root;}
public:TreeNode* constructMaximumBinaryTree(vector<int>& nums) {return traversal(nums, 0, nums.size());}
};

617.合并二叉树

优先掌握递归。

代码随想录

递归法

class Solution {
public:TreeNode* mergeTrees(TreeNode* t1, TreeNode* t2) {if (t1 == NULL) return t2;if (t2 == NULL) return t1;// 重新定义新的节点,不修改原有两个树的结构TreeNode* root = new TreeNode(0);root->val = t1->val + t2->val;root->left = mergeTrees(t1->left, t2->left);root->right = mergeTrees(t1->right, t2->right);return root;}
};

迭代法

class Solution {
public:TreeNode* mergeTrees(TreeNode* t1, TreeNode* t2) {if (t1 == NULL) return t2;if (t2 == NULL) return t1;queue<TreeNode*> que;que.push(t1);que.push(t2);while(!que.empty()) {TreeNode* node1 = que.front(); que.pop();TreeNode* node2 = que.front(); que.pop();// 此时两个节点一定不为空,val相加node1->val += node2->val;// 如果两棵树左节点都不为空,加入队列if (node1->left != NULL && node2->left != NULL) {que.push(node1->left);que.push(node2->left);}// 如果两棵树右节点都不为空,加入队列if (node1->right != NULL && node2->right != NULL) {que.push(node1->right);que.push(node2->right);}// 当t1的左节点 为空 t2左节点不为空,就赋值过去if (node1->left == NULL && node2->left != NULL) {node1->left = node2->left;}// 当t1的右节点 为空 t2右节点不为空,就赋值过去if (node1->right == NULL && node2->right != NULL) {node1->right = node2->right;}}return t1;}
};

700.二叉搜索树中的搜索

递归和迭代都掌握

二叉搜索树的特点是根节点比左孩子节点要大,比右孩子节点要小。

代码随想录

递归法:注意遍历左右子树的时候要返回函数,如果左右子树都遍历不到的时候,就返回空

class Solution {
public:TreeNode* searchBST(TreeNode* root, int val) {if (root == NULL || root->val == val) return root;if (root->val > val) return searchBST(root->left, val);if (root->val < val) return searchBST(root->right, val);return NULL;}
};
class Solution {
public:TreeNode* searchBST(TreeNode* root, int val) {while (root != NULL) {if (root->val > val) root = root->left;else if (root->val < val) root = root->right;else return root;}return NULL;}
};

98.验证二叉搜索树

遇到 搜索树,一定想着中序遍历,这样才能利用上特性。

注意根节点要比所有左子树的所有节点都要小,要比所有右子树的节点都要大。

方法一:maxValue来记录前一个节点的数值,如果前一个节点的数值(按照中序的遍历顺序,数组的值应该是递增的(如果是平衡二叉树的话),否则就不是平衡二叉树)
方法二:用pre记录前一个节点,当前节点和pre进行比较,pre进行更新。

class Solution {
public:TreeNode* pre = NULL; // 用来记录前一个节点bool isValidBST(TreeNode* root) {if (root == NULL) return true;bool left = isValidBST(root->left);if (pre != NULL && pre->val >= root->val) return false;pre = root; // 记录前一个节点bool right = isValidBST(root->right);return left && right;}
};

也可以用迭代法,只用增加一个指针指向前一个节点和判断什么时候返回fasle以及更新前一个指针的。
注意:while中是两个条件是或的情况!!!!

代码随想录

class Solution {
public:bool isValidBST(TreeNode* root) {stack<TreeNode*> st;TreeNode* cur = root;TreeNode* pre = NULL; // 记录前一个节点while (cur != NULL || !st.empty()) {if (cur != NULL) {st.push(cur);cur = cur->left;                // 左} else {cur = st.top();                 // 中st.pop();if (pre != NULL && cur->val <= pre->val)return false;pre = cur; //保存前一个访问的结点cur = cur->right;               // 右}}return true;}
};

http://www.ppmy.cn/news/1537555.html

相关文章

前端接收到的日期格式为 2021-12-07T16:44:53.298+00:00 怎么办?

在写项目的时候&#xff0c;给前端发送了一个 Date 类型的数据,发现格式不对&#xff1a; 可以通过在application 配置文件中进行如下配置&#xff1a; spring:jackson:date-format: yyyy-MM-dd HH:mm:sstime-zone: GMT8 前端在获取就发现格式正确

[Linux]从零开始的网站内网穿透教程

一、前言 在上一次教程中&#xff0c;我们教了大家如何搭建一个网站并且在内网中能被访问到。这样也出现了一个问题&#xff0c;我们的网站被我们部署得再好看&#xff0c;始终只有内网中的设备可以访问。如果别人和我们不在一个局域网中&#xff0c;就无法访问我们搭建的网站了…

Gin项目的初始化步骤和常见错误记录

相信很多人对Go的环境安装和Gin项目的初始化都已经手拿把攥很是熟练了&#xff0c;本节介绍一个自己新建Go项目时非常好用的设置以及记录一下Gin项目的初始化过程和常能遇到的错误。 一个容易忽略的Go ENV 在安装了Go的电脑中&#xff0c;我们可以在命令行执行 go env 命令&…

【无标题】SAP-MM物料检验分步过账z

在项目中,QM过账检验完成会一步过账,但实际业务部门需要质检只判定是否合格,仓库进行过账。 第一步ZQM006 质检判定 上图中选择合格,那么默认进入页面的使用决策代码为合格,如下图 如果勾选不合格,默认代码为ZR拒绝。 此处的出现让步接收数量,没有让步金额,金额是按物…

yolov8-melodic-cam-anconda环境配置及目标检测

1、基础环境安装 安装配置cuda、Anconda等环境&#xff0c;具体安装参考如下&#xff1a; https://blog.csdn.net/weixin_45702256/article/details/142555187 2、torch安装 下载链接&#xff1a;https://pytorch.org/ 根据配置下载对应版本&#xff0c;CUDA11.4 可用11.3下…

传统少数民族物品检测系统源码分享

传统少数民族物品检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer…

【学习记录】开源多模态检索/问答数据集

目录 写在前面通用多模态检索/问答数据集1. ALLaVA-4V2. LLaVA-v1.5-mix665k3. ShareGPT4V 训练数据集4. MiniGPT-4 微调数据集5. ShareGPT4V 训练数据集6. OmniCorpus7. MINT-1T 其他&#xff08;领域&#xff09;多模态检索/问答数据集1. GeoGPT4V&#xff08;用于解决几何问…

Adb端侧调试程序

adb的作用 ADB&#xff08;Android Debug Bridge&#xff09;是一个多功能的命令行工具&#xff0c;开发者和爱好者用来与安卓设备进行通信。它的主要作用包括&#xff1a; 调试应用&#xff1a;开发者可以在设备上运行和调试应用程序。传输文件&#xff1a;在电脑和安卓设备…