力扣第236题“二叉树的最近公共先祖”的解题思路
参考代码:
class Solution {public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {if (root == null) {return root;}if (root == p || root == q) {return root;}TreeNode left = lowestCommonAncestor(root.left, p, q);TreeNode right = lowestCommonAncestor(root.right, p, q);if (left != null && right != null) {return root;} else if (left != null) {return left;} else if (right != null) {return right;}return null;}
}
解题思路:递归法
递归三部曲:
- 确定递归函数返回值以及参数
可以利用上题目中返回值是TreeNode ,那么如果遇到p或者q,就把q或者p返回,返回值不为空,就说明找到了q或者p。
- 确定终止条件
如果找到了 节点p或者q,或者遇到空节点,就返回。
if (root == null) {return root;}if (root == p || root == q) {return root;}
- 确定单层递归逻辑
值得注意的是 本题函数有返回值,是因为回溯的过程需要递归函数的返回值做判断,但本题我们依然要遍历树的所有节点。
搜索一条边的写法:
if (递归函数(root.left)) return ;if (递归函数(root.right)) return ;
搜索整个树写法:
left = 递归函数(root.left);
right = 递归函数(root.right);
left与right的逻辑处理;
在递归函数有返回值的情况下:如果要搜索一条边,递归函数返回值不为空的时候,立刻返回,如果搜索整个树,直接用一个变量left、right接住返回值,这个left、right后序还有逻辑处理的需要,也就是后序遍历中处理中间节点的逻辑(也是回溯)。
而在此题中想利用left和right做逻辑处理, 不能立刻返回,而是要等left与right逻辑处理完之后才能返回,所以应该使用搜索整个树的写法。
先通过搜索整个树的写法,到达树的最底层,再一层层向上返回,在向上返回的过程中则需要判断出我们的所求值。
if (left != null && right != null) {return root;} else if (left != null) {return left;} else if (right != null) {return right;}//(left == null && right == null)return null;
如此图:先到达最底层6,5,满足 if (root == null||root == p || root == q) return root;所以返回6,5;
返回上一层后,7满足if (left != null && right != null) return root;,所以返回7;
而1则满足if (left == null && right == null) return null;,所以返回null;
15,20也同理返回null;
再返回上一层,10满足if(left==null&&right!=null)return right;所以仍然返回7;(这也就是为什么当left为null时要返回right的值,同理right为null时要返回left的值)
最后以此类推,返回的值即为所求值。
力扣第236题“二叉树的最近公共先祖”的解题思路相关推荐
- 零尽其用,尾随不落——探究力扣题目“移除字符串中的尾随零”的解题思路
本篇博客会讲解力扣"2710. 移除字符串中的尾随零"的解题思路,这是题目链接. 先来审题: 以下是示例: 以下是提示: 本题的思路是: 先遍历字符串,找到字符串末尾的\0. 从\ ...
- 力扣-第104题--二叉树的最大深度(python)--详细解析--逐步调试
给定一个二叉树,找出其最大深度. 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数. 说明: 叶子节点是指没有子节点的节点. 递归法: 解题思路: 1.首先判断根目录是否为空节点,如果是,返回0 ...
- 力扣第235题“二叉搜索树的最近公共先祖”的解题思路
参考代码: class Solution {public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {w ...
- 力扣(LeetCode)刷题,简单+中等题(第34期)
目录 第1题:整数转罗马数字 第2题:电话号码的字母组合 第3题:二叉树的所有路径 第4题:砖墙 第5题:下一个排列 第6题:括号生成 第7题:删除并获得点数 第8题:全排列 第9题:颜色分类 第10 ...
- 算法面试不懂这6大数据结构知识一定挂!(附力扣LeetCode真题讲解)
本文作者:苏勇,Google 资深技术工程师 首发地址:https://mp.weixin.qq.com/s/u8pvmupISQ5D4kGIkgfKbA 在互联网行业的算法面试中经常会被考到数据结构 ...
- Leetcode-How-What 力扣Leetcode刷题指南
Leetcode-How-What 力扣Leetcode刷题指南 About the way how to use Leetcode wisely for preparing the intervie ...
- 【JAVA】交错字符串——力扣每日一题(六)(2020.07.18)
目录 题目:97. 交错字符串 思路 如果你从本文中学习到丝毫知识,那么请您点点关注.点赞.评论和收藏 大家好,我是爱做梦的鱼,我是东北大学大数据实验班大三的小菜鸡,非常渴望优秀,羡慕优秀的人,个人博 ...
- leetcode 力扣每日一题系列详解——总目录
这是总目录,该系列持续更新中........ leetcode 力扣每日一题系列详解--总目录
- 【爬虫】力扣每日一题每天自动邮件提醒!!!
使用python实现了一个力扣每日一题每天自动邮件提醒的小爬虫,小但实用!!! 文章目录 A.需求来源与分析 B.技术角度分析 C.具体分析步骤 1.接口协议分析 2.发邮件 3.写crontab放服 ...
最新文章
- Juniper SRX340防火墙恢复出厂设置
- 微信小程序align_微信小程序四色花瓣
- SVM(二)从拉格朗日对偶问题到SVM
- rocketmq原理_彻底看懂RocketMQ事务实现原理
- 洛谷P2734 游戏 A Game
- java 使用logback进行日志输出
- 计算机网络学习笔记(5. 电路交换)
- 统计学习方法读书笔记4-感知机课后习题
- 计算机硬盘磁道损坏有什么症状,硬盘0磁道(0磁道)损坏的维修方法
- 老师常用选择题,选择框,单选框,以及各行业产品配置表单选配置明细等
- linux 命令chmod 755的意思
- 自定义Unity调色板
- Docker Linux下安装配置及启动
- idea2022报错: No appropriate protocol (protocol is disabled or cipher suites are inappropriate)
- DNS知识及域名解析内容深入浅出超详细总结附DNS配置教程
- Django分页+增删改查
- 某喷码机品牌U盘存储的配置文件简记
- 关于ANCII和UNICODE
- Python报错:NameError: name 'reduce' is not defined 和 reduce()函数介绍
- RTOS bookmark