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

本题看起来不好做,其实利用BST的性质思路就很简单了。利用BST中序遍历递增的性质,只要将当前遍历的结点与前一个结点比较即可。这里使用递归法来写。
(当不清楚递归中是否需要返回值或单纯的需要遍历二叉树的情况,可以尝试使用额外的递归函数)
递归三部曲:

  1. 输入输出:这里输入自然是结点;输出其实我一开始的思路是返回值为int,然后利用返回值进行对比,后来发现行不通,就直接利用全局变量来作为答案,这样不需要处理返回值那么递归函数的返回类型为void
  2. 终止条件:遍历二叉树,终止条件自然为if(cur == NULL)
  3. 单层递归逻辑:BST是中序遍历,所以结点的处理顺序是左中右

下面是具体的代码:

 int result = INT_MAX;TreeNode* pre = NULL;void travesal(TreeNode* cur){if(cur == NULL) return;travesal(cur->left);if(pre && cur->val - pre->val < result){result = cur->val - pre->val;}pre = cur;travesal(cur->right);}

定义两个全局变量,一个用来存放答案,一个用来存放pre结点,这种手法在前一天的题目也见到了。最后在主函数调用即可。

501.二叉搜索树中的众数

本题有两个地方需要注意的:

  • 二叉树的结点值是可以重复的
  • 众数可以是多个,只要是出现频次相同就作为答案输出

考虑使用递归法来写,下面是递归三部曲:

  1. 输入输出:本题和上一题差不多,额外写一个递归函数,返回值为void
  2. 终止条件:if(cur == NULL)
  3. 单层递归逻辑:还是使用pre指针,令其与当前结点对比,遍历顺序还是中序

首先需要定义几个全局变量:

 TreeNode* pre = NULL;int count = 0; //统计当前的频次int max_count = 0; //记录最大频次vector<int> ans; //输出答案

下面是递归函数:

void travesal(TreeNode* cur){if(cur == NULL) return;travesal(cur->left);if(pre == NULL) count = 1; //空节点count为1else if(pre->val == cur->val) count++;else count = 1; //不等的情况pre = cur;//特殊的处理if(count == max_count) ans.push_back(cur->val); //满足条件输入if(count > max_count){ //当出现频次更高的情况,将之前的答案全部清除max_count = count; //更新最大频次ans.clear();ans.push_back(cur->val); //输入当前答案}travesal(cur->right);}

这里需要注意对pre == NULL时,count置为1;在答案输出处理逻辑上,使用先输入再判断的方式,可以在一次遍历中就输出答案。

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


本题还是很有难度的,乍一看就没什么思路,然后再想了一些没用的判断条件,其实不用想那么复杂,看完卡哥的视频后豁然开朗。首先需要想清楚本题使用自下而上的遍历方式,也就是使用后序遍历最后处理中结点。当遇到符合条件的结点时直接向上一层返回,除非p和q都不包含返回NULL,其余的情况都往上返回存在p或q的结点,这样想明白递归的过程就会发现这样会自然而然的返回最近的公共祖先。
递归三部曲:

  1. 输入输出:这里直接使用给出的主函数递归,返回值类型为TreeNode*
  2. 终止条件:if(root == NULL) return NULL;重点需要注意的是本题结点本身也算是自己的祖先,所以要加上if(root == q || root == p) return root;
  3. 单层递归逻辑:只要注意使用后序遍历就行

如果函数返回值为NULL,就说明当前结点没有题目要求的子树,代码如下:

TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {if(root == NULL) return NULL;if(root == q || root == p) return root;TreeNode* left = lowestCommonAncestor(root->left, p, q);TreeNode* right = lowestCommonAncestor(root->right, p, q);//只要遇到符合条件的就返回结点if(left != NULL && right != NULL) return root;if(left != NULL && right == NULL) return left;if(left == NULL && right != NULL) return right;return NULL;}

代码很简洁,主要是得想明白,另外:结点本身也算是自己的祖先需要注意。

代码随想录第二十一天 LeetCode 530、501、236相关推荐

  1. 代码随想录刷题|LeetCode 332.重新安排行程 51. N皇后 37. 解数独

    目录 332.重新安排行程 思路 重新安排行程 51. N皇后 思路 N皇后 37. 解数独 思路 解数独         这三道题目都是困难题目,都是根据代码随想录的思路总结书写,慢慢理解,慢慢熟练 ...

  2. 【代码随想录】【LeetCode】自学笔记07 - 栈和队列

    总结 基础补牢:[https://blog.csdn.net/tham_/article/details/44733101] 根据[http://c.biancheng.net/view/3354.h ...

  3. 【代码随想录】【LeetCode】学习笔记04-哈希表

    前言 哈希法牺牲了空间换取了时间,因为我们要使用额外的数组,set或者是map来存放数据,才能实现快速的查找. 如果遇到需要判断一个元素是否出现过的场景,应该第一时间想到哈希法! 四个常见哈希表类型对 ...

  4. 代码随想录刷题|LeetCode 1049. 最后一块石头的重量II 494. 目标和 474.一和零

    目录 1049. 最后一块石头的重量 II 思路 最后一块石头的重量|| 494. 目标和 思路 0.求什么 1.确定dp数组的含义 2.递推公式 3.初始化dp数组 4.遍历顺序 目标和 474.一 ...

  5. 代码随想录算法训练营第二天|leetcode 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II

    leetcode 977.有序数组的平方 想到昨天写的双指针,十分刻意用了一下,感觉还是比较生疏,还得加强练习和思考,然后发现还需要排序,想到了vector的排序sort(),但是觉得直接用不好,也忘 ...

  6. Leetcode 704.二分查找 27.移除元素 代码随想录day1

    本系列目的在于跟练代码随想录,以及记录自己在数据结构与算法方面的一些学习 704.二分查找 其实之前自己在随便刷题的时候看过这道题目,就是一个纯新手的大状态,第一次听到二分查找这样的东西,然后跟着题解 ...

  7. 代码随想录(day04)-LeetCode:24、19、面试题02.07、142

    代码随想录:dayo4 1. [24]两两交换链表中的节点 虚拟头结点实现 递归实现 2.[19]**删除链表的倒数第N个节点** 双指针算法 3. 面试题[02.07]:链表相交 4.[142]环形 ...

  8. Leetcode刷题笔记(代码随想录)

    1 数组 1.1 二分查找 第一种写法:我们定义 target 是在一个在左闭右闭的区间里,也就是[left, right] .区间的定义这就决定了二分法的代码应该如何写,因为定义target在[le ...

  9. 【代码随想录二刷】Day21-二叉树-C++

    代码随想录二刷Day21 今日任务 530.二叉搜索树的最小绝对差 501.二叉搜索树中的众数 236.二叉树的最近公共祖先 语言:C++ 530. 二叉搜索树的最小绝对差 链接:https://le ...

  10. 代码随想录一刷个人记录

    代码随想录一刷个人记录 2022/7/14(leetcode) 2022/7/15(leetcode) 2022/7/17[字符串] 2022/7/18[字符串] 2022/7/20[双指针] 202 ...

最新文章

  1. 中国数据中心市场时评—简析全国数据中心布局情况
  2. 直播 | 同源共流:一个优化框架统一与解释图神经网络
  3. python多分支实现四则运算器代码_一份让Python疯狂加速的工具合集!
  4. 【图像处理】——Python实现two_pass方法来进行连通域的提取
  5. [2016-03-15]rabbitmq notes
  6. 澳门大学物联网设计方法研究获“973”立项
  7. mysql 批量删除_Python接口测试之对MySQL的增、删、改、查操作(五)
  8. 一个普通二叉树的遍历
  9. Oracle role and user privileges
  10. 虚拟环境--virtualenv
  11. mysql第二条减第一条_Mysql SQL优化
  12. win环境sftp软件_在Windows上使用sftp工具—WinSCP
  13. 基于WEB的达内学子书城/商城源代码
  14. Python:安装pip
  15. python二级操作题评分方法_第二卷讲解Python语言计算机等级考试二级操作题
  16. JavaFx教程-02第一个javaFX程序
  17. Notepad++ 无法安装 HexEditor 插件 / 安装之后闪退
  18. 用 RNN 建立语言模型
  19. IIS SSL客户端证书(忽略/接受/必须)之三——思考验证(3)
  20. 网络基础:ISO网络七层模型

热门文章

  1. vue中用js将json数据按英文字母顺序进行排序
  2. 用C#写一个微信登录软件(自己写协议)
  3. Spark推测执行spark.speculation
  4. 未经处理的异常:System.BadImageFormatException:“未能加载文件或程序集“GxIAPINET
  5. ZOJ - 3939
  6. 东南大学计算机系分数,2017最新东南大学专业排名及分数线
  7. 超纯水工业水处理工程方案解析
  8. Neo4j 第二篇:图形数据库
  9. numpy学习线性回归, 并用matplotlib画动态图
  10. 磁盘驱动器或Windows Home Server失败的情况挽救了我的婚姻