代码随想录打卡—day21—【二叉树】— 8.21

1 530. 二叉搜索树的最小绝对差

530. 二叉搜索树的最小绝对差

想法:先直接中序遍历(升序的序列)过程中相邻两个数的差值取min,自己写一次AC代码:

/*** 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 min_ans;int ok = 0;   //全局遍历 第一个元素特殊处理!TreeNode* old;   //全局遍历!int search(TreeNode* root)  // 返回前一个节点的val{if(!root) return root->val;int ans1 = 0xffff;int ans2 = 0xffff;if(root->left)ans1 = search(root->left);int tmpval = root->val;cout << tmpval << endl;if(ok)min_ans = min(min_ans,abs(tmpval - old->val));old = root;ok=1;if(root->right)ans2 = search(root->right);return tmpval;}int getMinimumDifference(TreeNode* root) {// 想法:先直接中序遍历(升序的序列)相邻两个数的差值取minmin_ans = INT_MAX;ok=0;search(root);return min_ans;}
};

看了题解,思路和我的一样,但是写法更加简单(设置old起始为null,非null表示非第一次,并且后一步每次都更新old ),学习并写一遍AC代码:

/*** 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 ans = INT_MAX;TreeNode* old =  NULL;void search(TreeNode* root){if(root == NULL)return;search(root->left);if(old)ans = min(ans,abs(root->val - old->val));old = root;search(root->right);}int getMinimumDifference(TreeNode* root) {search(root);return ans;}
};

 2 501. 二叉搜索树中的众数

501. 二叉搜索树中的众数

如果拿一个数组存中序遍历结果很容易,但是题目进阶要求:不要额外的空间。有一些麻烦的思路,比如全局变量维护max的值与数目,每次函数都传递当前值和数目的参数(题解证明不用传参 直接全局变量更新新的cnt即可),不确定能不能实现,然后看题解:

  • 知道了普通二叉树的做法时候:最直观的方法一定是把这个树都遍历了,用map统计频率,把频率排个序(有的同学可能可以想直接对map中的value排序,还真做不到,C++中如果使用std::map或者std::multimap可以对key排序,但不能对value排序。所以要把map转化数组即vector,再进行排序,当然vector里面放的也是pair<int, int>类型的数据,第一个int为元素,第二个int为出现频率。),最后取前面高频的元素的集合。
  • 在递归遍历二叉搜索树的过程中,介绍了一个统计最高出现频率元素集合的技巧, 要不然就要遍历两次二叉搜索树才能把这个最高出现频率元素的集合求出来。为什么没有这个技巧一定要遍历两次呢? 因为要求的是集合,会有多个众数,如果规定只有一个众数,那么就遍历一次稳稳的了。和我的思路差不多,就是把我模糊的想法落地了。

/*** 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 cnt = INT_MIN;int maxcnt = INT_MIN;TreeNode* old = NULL;vector<int> ans;void search(TreeNode* root){if(root == NULL)return;search(root->left);// 计算当前cntif(!old)cnt = 1;else{if(root->val == old->val)cnt++;else  //新的元素cnt = 1;}// 计算最大的cnt 和 更新结果if(cnt > maxcnt){maxcnt = cnt;ans.clear();ans.push_back(root->val);}else if(cnt == maxcnt)ans.push_back(root->val);old = root;search(root->right);}vector<int> findMode(TreeNode* root) {search(root);return ans;}
};

3 236. 二叉树的最近公共祖先

236. 二叉树的最近公共祖先

我一开始写了一个递归的版本,其实只用了递归但没有迭代,结果在第29个测试点超出内存限制,不知道是不是TLE,如下:

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/
class Solution {
public:vector<vector<TreeNode*>> ans;void search(TreeNode* root, TreeNode* p, TreeNode* q,vector<TreeNode*> path){if(root == p || root == q)  // 获得结果并不returnans.push_back(path);if(!root->left && !root->right)return;path.push_back(root->left);if(root->left)search(root->left,p,q,path);path.pop_back();path.push_back(root->right);if(root->right)search(root->right,p,q,path);path.pop_back();}TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {//我的思路 写一个函数找到p和q的祖宗路线存在来然后对比两个序列即可。vector<TreeNode*> path;path.push_back(root);search(root , p , q ,path);int i = 0;for(; i < ans[0].size();i++)if(ans[0][i] != ans[1][i])return ans[0][i-1];return ans[0][i-1];}
};

看了题解,正确的思路应该是不止递归,更要好好用到回溯==》后序遍历,基本逻辑是:

  • 如果当前节点是p,是q,或者是空直接返回当前节点。(想象如果p是q的父节点 这里的直接return也是满足要求的!!!)
  • 后序遍历后:
  1. 左子树如果没有pq,右子树也没有pq,就return 空
  2. 左子树如果没有pq,右子树有pq,就返回右子树的结果
  3. 左子树如果有pq,右子树没有pq,就返回左子树的结果
  4. 左右都有的话,说明当前节点就是最近的公共父节点!!!!!!!

我感觉这个写法还是比较妙的写法,有一些一个变量表达2个含义的感觉,没有冗余的东西AC代码:

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/
class Solution {
public:TreeNode* search(TreeNode* root, TreeNode* p, TreeNode* q){if(root == p || root == q || root == NULL)  // 获得结果并不returnreturn root;TreeNode* left = search(root->left,p,q);TreeNode* right = search(root->right,p,q);if(left && right)return root;else if(left && !right)return left;else if(!left && right)return right;else return NULL;}TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {return search(root , p , q );}
};

总结:

这一节累计用时2h。


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

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

相关文章

Facebook 应用未启用:这款应用目前无法使用,应用开发者已得知这个问题。

错误&#xff1a;Facebook 应用未启用:这款应用目前无法使用&#xff0c;应用开发者已得知这个问题。应用重新启用后&#xff0c;你便能登录。 「应用未经过审核或未发布」&#xff1a; 如果一个应用还没有经过Facebook的审核或者开发者尚未将应用发布&#xff0c;那么它将无法…

【Mysql】MVCC版本机制的多并发

&#x1f307;个人主页&#xff1a;平凡的小苏 &#x1f4da;学习格言&#xff1a;命运给你一个低的起点&#xff0c;是想看你精彩的翻盘&#xff0c;而不是让你自甘堕落&#xff0c;脚下的路虽然难走&#xff0c;但我还能走&#xff0c;比起向阳而生&#xff0c;我更想尝试逆风…

iOS设计规范是什么?都有哪些具体规范

iOS设计规范是苹果为移动设备操作系统iOS制定的设计指南。iOS设计规范的制定保证了苹果应用在外观和操作上的一致性和可用性&#xff0c;从而提高了苹果界面设计的用户体验和应用程序的成功性。本文将从七个方面全面分析iOS设计规范。 1.iOS设计规范完整版分享 由「即时设计」…

【LeetCode75】第三十四题 叶子相似的树

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 给我们两棵二叉树&#xff0c;让我们判断这两棵二叉树的从左到右的叶子节点组成的叶子序列是否一致&#xff0c;即从左到右的叶子节点的数…

Open3D 进阶(5)变分贝叶斯高斯混合点云聚类

目录 一、算法原理二、代码实现三、结果展示四、测试数据本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 系列文章(连载中。。。爬虫,你倒是爬个完整的呀?): Open3D 进阶(1) MeanShift点云聚类Open3D 进阶(2)DB…

Ajax介绍

1.与服务器进行数据交换&#xff1a;通过 Ajax 可以给服务器发送请求&#xff0c;并获取服务器响应的数据。 2.异步交互&#xff1a;可以在 不重新加载整个页面 的情况下&#xff0c;与服务器交换数据并 更新部分网页 的技术&#xff0c;如&#xff1a; 搜索联想、用户名是否可…

浅析Linux SCSI子系统:调试方法

文章目录 SCSI日志调试功能scsi_logging_level调整SCSI日志等级 SCSI trace events使能SCSI trace events方式一&#xff1a;通过set_event接口方式二&#xff1a;通过enable 跟踪trace信息 相关参考 SCSI日志调试功能 SCSI子系统支持内核选项CONFIG_SCSI_LOGGING配置日志调试…

Django学习笔记(2)

创建app 属于自动执行了python manage.py 直接在里面运行startapp app01就可以创建app01的项目了 之后在setting.py中注册app01 INSTALLED_APPS ["django.contrib.admin","django.contrib.auth","django.contrib.contenttypes","django.c…

Dockerfile制作Web应用系统nginx镜像

目录 1.所需实现的具体内容 2.编写Dockerfile Dockerfile文件内容&#xff1a; 默认网页内容&#xff1a; 3.构建镜像 4.现在我们运行一个容器&#xff0c;查看我们的网页是否可访问 5.现在再将我们的镜像打包并上传到镜像仓库 1.所需实现的具体内容 基于centos基础镜像…

Linux学习之ssh和scp

ls /etc/ssh可以看到这个目录下有一些文件&#xff0c;而/etc/ssh/ssh_config是客户端配置文件&#xff0c;/etc/ssh/sshd_config是服务端配置文件。 cat -n /etc/ssh/sshd_config | grep "Port "可以看一下sshd监听端口的配置信息&#xff0c;发现这个配置端口是22…

async和await

一&#xff0c;基本使用 其实就是之前学过的异步函数&#xff0c;异步编程在函数前写一个ansyc&#xff0c;就转化为异步函数&#xff0c;返回的是一个promise对象&#xff0c;于是就可以使用await关键字&#xff0c;可以把异步函数写成同步函数的形式&#xff0c;极大地提高代…

python之Numpy

ndarray数组对象 NumPy定义了一个n维数组对象&#xff0c;简称ndarray对象&#xff0c;它是一个一系列相同类型元素组成的数组集合。数组中的每个元素都占有大小相同的内存块 ndarray 对象采用了数组的索引机制&#xff0c;将数组中的每个元素映射到内存块上&#xff0c;并且按…

LeetCode 542. 01 Matrix【多源BFS】中等

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…

Java日常的String、Date、计算问题

一、String相关类 三者执行速度&#xff1a;StringBuilder > StringBuffer > String 1.1、String 每次对 String 类型改变的时&#xff0c;都会生成一个新的 String 对象&#xff0c;指针指向新的 String 对象。 适用于字符串不常变的&#xff0c;少量的数据场景中&am…

【数据分析入门】Jupyter Notebook

目录 一、保存/加载二、适用多种编程语言三、编写代码与文本3.1 编辑单元格3.2 插入单元格3.3 运行单元格3.4 查看单元格 四、Widgets五、帮助 Jupyter Notebook是基于网页的用于交互计算的应用程序。其可被应用于全过程计算&#xff1a;开发、文档编写、运行代码和展示结果。 …

未来公文的智能化进程

随着技术的飞速发展&#xff0c;公文——这个有着悠久历史的官方沟通方式&#xff0c;也正逐步走向智能化的未来。自动化、人工智能、区块链...这些现代科技正重塑我们的公文制度&#xff0c;让其变得更加高效、安全和智慧。 1.语义理解与自动生成 通过深度学习和NLP&#xff…

负载均衡下的 WebShell 连接

目录 负载均衡简介负载均衡的分类网络通信分类 负载均衡下的 WebShell 连接场景描述难点介绍解决方法**Plan A** **关掉其中一台机器**&#xff08;作死&#xff09;**Plan B** **执行前先判断要不要执行****Plan C** 在Web 层做一次 HTTP 流量转发 &#xff08;重点&#xff0…

Window下部署使用Stable Diffusion AI开源项目绘图

Window下部署使用Stable Diffusion AI开源项目绘图 前言前提条件相关介绍Stable Diffusion AI绘图下载项目环境要求环境下载运行项目打开网址&#xff0c;即可体验文字生成图像&#xff08;txt2img&#xff09;庐山瀑布 参考 本文里面的风景图&#xff0c;均由Stable Diffusion…

聊聊智能手表

目录 1.什么是智能手表 2.智能手表的发展过程 3.智能手表有哪些功能 4.智能手表给人类带来的福利 1.什么是智能手表 智能手表是一种智能穿戴设备&#xff0c;结合了传统手表的时间显示功能和智能手机的一些功能。它通常配备有触摸屏、操作系统、处理器、内存、传感器以及与智…

[JavaWeb]【二】Vue Ajax Elemnet Vue路由打包部署

目录 一 什么是Vue 1.1 Vue快速入门 1.2 常用指令 1.2.1 v-bind && v-model 1.2.2 v-on 1.2.3 v-if && v-show 1.2.4 v-for 1.2.5 案例 1.3 生命周期 二 Ajax 2.1 Ajax介绍 2.2 同步与异步 2.3 原生Ajax&#xff08;繁琐&#xff0c;过时了&#xff09…