代码随想录算法训练营刷题复习10:二叉树、二叉搜索树复习2

二叉树、二叉搜索树 力扣题复习

  1. 110. 平衡二叉树
  2. 257. 二叉树的所有路径
  3. 404. 左叶子之和
  4. 513. 找树左下角的值
  5. 112.路径之和
  6. 113.路经总和ii
  7. 450. 删除二叉搜索树中的节点
  8. 701. 二叉搜索树中的插入操作

110. 平衡二叉树
左右子树高度差要小于1
->递归调用(need新的函数),遇到空就返回0
->left计算左子树高度 right计算右子树高度
->遇到-1就返回-1
->最后计算高度差,大于1就返回-1
->回到isBalance,遇到-1说明不平衡

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:int getHeight(TreeNode* node) {if(node == NULL)return 0;int left_h = getHeight(node->left);if(left_h == -1)return -1;int right_h = getHeight(node->right);if(right_h == -1)return -1;return abs(left_h-right_h) > 1 ? -1 : 1+max(left_h,right_h);}bool isBalanced(TreeNode* root) {return (getHeight(root)==-1)? false:true;}
};

257. 二叉树的所有路径

记录头结点到每个叶子节点的路径,需要用到回溯
①traversal递归函数,参数root、res、path(回溯熟悉的两件套+root)
②(前提:保证传入函数的节点非空)
第一步,先把值存到path,(to_string)
第二步,终止条件:到达叶子节点,path写入res,return
第三步,判断左孩,不空,
path加入->,递归调用
回溯,path弹出 - 和>
第四步,判断右孩,不空,同第三步处理

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:void traversal(TreeNode* cur, string path, vector<string>& res) {path += to_string(cur->val);if(cur->left==NULL && cur->right==NULL) {res.push_back(path);return;}if(cur->left != NULL) {path += "->";traversal(cur->left,path,res);path.pop_back();path.pop_back();}if(cur->right != NULL) {path += "->";traversal(cur->right,path,res);path.pop_back();path.pop_back();}}vector<string> binaryTreePaths(TreeNode* root) {string path;vector<string> res;if(root==NULL)return res;traversal(root,path,res);return res;}
};

404. 左叶子之和

左叶子之和:
①判root空 返回0; 判root无左右孩子,返回0;
②递归调用有返回值:
left 记录左子树的左叶子之和
满足条件:node左孩不空,node左孩没有孩(为叶子节点),更新left值
right记录右子树中的左叶子之和
返回left+right一共的左叶子之和

class Solution {
public:int sumOfLeftLeaves(TreeNode* root) {if(root==NULL)return 0;if(root->left==NULL && root->right==NULL)return 0;int left_value = sumOfLeftLeaves(root->left);if(root->left && !root->left->left && !root->left->right)left_value = root->left->val;int right_value = sumOfLeftLeaves(root->right);return left_value + right_value;}
};

513. 找树左下角的值
层序遍历,添加记录每一层的第一个元素result(如果还有下一层直接把上一层的保存的值覆盖掉就行)

class Solution {
public:int findBottomLeftValue(TreeNode* root) {queue<TreeNode*> que;int result = 0;if(root==NULL) return 0;que.push(root);while(!que.empty()) {int size = que.size();for(int i=0;i<size;i++) {TreeNode* node = que.front();que.pop();if(i==0)result = node->val;if(node->left) que.push(node->left);if(node->right) que.push(node->right);}}return result;}
};

112.路径之和

路径之和(这轮没写出来)

class Solution {
public:int traversal(TreeNode* node, int temp_sum) {if(!node->left && !node->right && temp_sum==0)return true;else if(!node->left && !node->right)return false;if(node->left) {temp_sum-=node->left->val;if(traversal(node->left,temp_sum))return true;temp_sum+=node->left->val;}if(node->right) {temp_sum-=node->right->val;if(traversal(node->right,temp_sum))return true;temp_sum+=node->right->val;}return false;}bool hasPathSum(TreeNode* root, int targetSum) {if(root==NULL)return false;return traversal(root,targetSum-root->val);}
};

113.路经总和ii
也是需要用到回溯,这个题和上一个题可以再复习下。

class Solution {
public:vector<vector<int>> res;vector<int> path;void traversal(TreeNode* root,int temp_sum) {if(!root->left && !root->right && temp_sum==0) {res.push_back(path);return;}else if(!root->left && !root->right)return;if(root->left) {temp_sum-=root->left->val;path.push_back(root->left->val);traversal(root->left,temp_sum);temp_sum+=root->left->val;path.pop_back();}if(root->right) {temp_sum-=root->right->val;path.push_back(root->right->val);traversal(root->right,temp_sum);temp_sum+=root->right->val;path.pop_back();}return;}vector<vector<int>> pathSum(TreeNode* root, int targetSum) {if(root==NULL)return res;path.push_back(root->val);traversal(root,targetSum-root->val);return res;}
};

450. 删除二叉搜索树中的节点

二叉搜索树:比大小
==①无孩子节点,直接删
②有左孩
左孩替代当前node
③有右孩
右孩替代当前node
③左右孩都存在
while找到右子树的最左下的孩儿,继承node的左子树,然后将node更新为右孩。

class Solution {
public:TreeNode* deleteNode(TreeNode* root, int key) {if(root==nullptr)return root;if(root->val==key) {if(root->left==nullptr && root->right==nullptr) {delete root;return nullptr;}else if(root->right==nullptr) {auto retnode = root->left;delete root;return retnode;}else if(root->left==nullptr) {auto retnode = root->right;delete root;return retnode;}else {TreeNode* cur = root->right;//这里是找到右子树的最左叶子节点while(cur->left!=nullptr) cur = cur->left;cur->left = root->left;TreeNode* temp = root;root = root->right;delete temp;return root;}}if(root->val < key) {root->right = deleteNode(root->right,key);}if(root->val > key) {root->left = deleteNode(root->left,key);}return root;}
};

701. 二叉搜索树中的插入操作
插入一定是在叶子节点的位置,关键在于找到插入点的位置:二叉搜索树的特性 比大小

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/36215.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

API-元素尺寸与位置

学习目标&#xff1a; 掌握元素尺寸与位置 学习内容&#xff1a; 元素尺寸与位置仿京东固定导航栏案例实现bilibili点击小滑块移动效果 元素尺寸与位置&#xff1a; 使用场景&#xff1a; 前面案例滚动多少距离&#xff0c;都是我们自己算的&#xff0c;最好是页面滚动到某个…

[leetcode]圆圈中最后剩下的数字/ 破冰游戏

. - 力扣&#xff08;LeetCode&#xff09; class Solution {int f(int num, int target) {if (num 1) {return 0;}int x f(num - 1, target);return (target x) % num;} public:int iceBreakingGame(int num, int target) {return f(num, target);} };

程序猿大战Python——Python与MySQL交互一

pymysql模块的安装 目标&#xff1a;了解如何安装pymysql模块&#xff1f; 当要使用Python和MySQL数据库进行交互&#xff0c;需要借助一个第三方模块&#xff1a;pymysql。 在使用pymysql模块前&#xff0c;先进行安装&#xff1a; pip install pymysql 有时使用pip instal…

从零开始做题:有手就行

1 题目 2 解题 ARPHCR工具破解 得到flag DASCTF{2b3767763885a019b65bbfe9d1136c3b}

数据结构与算法笔记:高级篇 - 向量空间:如何实现一个简单的音乐推荐系统?

概述 很多人喜都喜爱听歌&#xff0c;以前我们用 MP3 听歌&#xff0c;现在直接通过音乐 App 在线就能听歌。而且&#xff0c;各种音乐 App 的功能越来越强大&#xff0c;不仅可以自己选歌听&#xff0c;还可以根据你听歌的喜好&#xff0c;给你推荐你可能会喜好的音乐&#x…

【WEB前端2024】3D智体编程:乔布斯3D纪念馆-第49课-机器人自动跳舞

【WEB前端2024】3D智体编程&#xff1a;乔布斯3D纪念馆-第49课-机器人自动跳舞 使用dtns.network德塔世界&#xff08;开源的智体世界引擎&#xff09;&#xff0c;策划和设计《乔布斯超大型的开源3D纪念馆》的系列教程。dtns.network是一款主要由JavaScript编写的智体世界引擎…

DevExpress Office File API教程 - 如何使用AI服务增强Word文档可访问性和语言支持?

DevExpress Office File API是一个专为C#, VB.NET 和 ASP.NET等开发人员提供的非可视化.NET库。有了这个库&#xff0c;不用安装Microsoft Office&#xff0c;就可以完全自动处理Excel、Word等文档。开发人员使用一个非常易于操作的API就可以生成XLS, XLSx, DOC, DOCx, RTF, CS…

使用隐式事件执行控制图

什么是隐式事件&#xff1f; 隐式事件是图表执行时发生的内置事件&#xff1a; 图表唤醒 进入一个状态 退出状态 分配给内部数据对象的值 这些事件是隐式的&#xff0c;因为您没有显式地定义或触发它们。隐式事件是它们发生的图表的子级&#xff0c;仅在父图表中可见。 隐式事…

【AI生成】海上风电中卫星网络与无线自组网的应用分析

随着可再生能源的不断发展&#xff0c;海上风电作为其中的重要组成部分&#xff0c;在我国能源结构调整中占据越来越重要的地位。近年来&#xff0c;我国海上风电产业发展迅速&#xff0c;海上风电场数量和规模不断扩大&#xff0c;相应地&#xff0c;海上风电运维和安全保障的…

git branch -a 不显示远程分支修复

使用git remote -v命令&#xff0c;查看所有的远程仓库及其URL如果没有&#xff0c;说明没有远程仓库&#xff0c;继续往下走使用git remote add origin <url>命令来添加或修改远程仓库&#xff1a;其中<url>是远程仓库的正确URL&#xff0c;就是git项目的http的地…

实现Java中的图像处理功能

实现Java中的图像处理功能 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;在本篇文章中&#xff0c;我们将探讨如何在Java中实现图像处理功能。图像处理是计算机…

Embedding的概念和展开

前言 本章&#xff0c;我们介绍一个非常细的细节技术。让我们微调大模型的一些特性和能力。 在大模型的AI套路演化过程中&#xff0c;其实经历了太多的技术革新和方式变化&#xff0c;Embedding其实也可能是其中一个高速湮灭的技术点之一。 对比LoRA现在大红大紫&#xff0c…

每个 Node.js 开发人员都应该知道的13个库(下)

7. Sequelize Mongoose是一个Node。基于js的MongoDB对象建模工具&#xff0c;通常被称为对象数据建模&#xff08;ODM&#xff09;库&#xff0c;它提供了诸如钩子、模型验证、连接和查询等功能。 Mongoose为应用程序数据提供了一个基于模式的解决方案&#xff0c;它在应用程…

【JavaScript脚本宇宙】玩转数据存储:深入剖析提升 Web 应用程序性能的六大利器

从本地到云端&#xff1a;全面解析满足各种需求的高性能 JavaScript 数据库库 前言 本文将介绍几个流行的JavaScript数据库库&#xff0c;包括localForage、Dexie.js、PouchDB、LokiJS和NeDB。每个库都有自己的特点和适用场景。通过比较它们的功能和使用方式&#xff0c;可以…

论文翻译 | ITER-RETGEN:利用迭代检索生成协同增强检索增强的大型语言模型

论文地址&#xff1a;Enhancing Retrieval-Augmented Large Language Models with Iterative Retrieval-Generation Synergy 摘要 检索增强生成由于有望解决包括过时知识和幻觉在内的大型语言模型的局限性而引起广泛关注。然而&#xff0c;检索器很难捕捉相关性&#xff0c;尤…

BurpSuite2024.5.3专业版,仅支持Java21以上

01更新介绍 此版本引入了对 WebSocket 的 Burp Scanner 支持、对录制的登录编辑器的改进、WebSocket 匹配和替换规则以及许多性能改进。我们还删除了一些冗余的扫描检查。 Burp Scanner 对 WebSockets 的支持我们更新了内部代理的配置&#xff0c;以允许 WebSocket 流量。这使…

代码随想录算法训练营第五十一天| 115.不同的子序列、583. 两个字符串的删除操作、 72. 编辑距离

LeetCode 115.不同的子序列 题目链接&#xff1a;https://leetcode.cn/problems/distinct-subsequences/description/ 文章链接&#xff1a;https://programmercarl.com/0115.%E4%B8%8D%E5%90%8C%E7%9A%84%E5%AD%90%E5%BA%8F%E5%88%97.html 思路 * dp[i][j]&#xff1a;以i-1…

Docker快速极简配置nginx实现不同域名访问分流

文章目录 前言安装配置使用镜像拉取及环境配置修改代理文件编写docker-compose文件启动nginx代理 总结 前言 本文主要记录如何使用docker安装配置Nginx&#xff0c;如何使用Nginx把通过80、443端口访问的请求根据域名分发到不同端口。那么什么是Nginx呢&#xff0c;下边做个简…

将产品制作成3D模型在网站上展示需要多少费用?

将产品制作成3D模型并在网站上展示的费用会因多种因素而异&#xff0c;包括模型的复杂度、所需的细节程度、制作3D模型的软件和工具、以及是否需要专业设计师的服务等。此外&#xff0c;不同的3D模型制作服务提供商可能会有不同的定价标准。 如果能自己制作3D模型&#xff0c;…

友力科技IDC机房搬迁方案流程分享

机房搬迁流程 系统搬迁实施流程包括&#xff1a;准备、拆卸、装运、安装、调试等五个流程&#xff0c;具体如下&#xff1a; 准备:包括相关人员和设备准备、新机房环境准备、网络环境、备份、现场所有设备打标签、模块、设备准备等准备工作。拆卸&#xff1a;主要只核心设备下…