参考代码:

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题“二叉树的最近公共先祖”的解题思路相关推荐

  1. 零尽其用,尾随不落——探究力扣题目“移除字符串中的尾随零”的解题思路

    本篇博客会讲解力扣"2710. 移除字符串中的尾随零"的解题思路,这是题目链接. 先来审题: 以下是示例: 以下是提示: 本题的思路是: 先遍历字符串,找到字符串末尾的\0. 从\ ...

  2. 力扣-第104题--二叉树的最大深度(python)--详细解析--逐步调试

    给定一个二叉树,找出其最大深度. 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数. 说明: 叶子节点是指没有子节点的节点. 递归法: 解题思路: 1.首先判断根目录是否为空节点,如果是,返回0 ...

  3. 力扣第235题“二叉搜索树的最近公共先祖”的解题思路

    参考代码: class Solution {public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {w ...

  4. 力扣(LeetCode)刷题,简单+中等题(第34期)

    目录 第1题:整数转罗马数字 第2题:电话号码的字母组合 第3题:二叉树的所有路径 第4题:砖墙 第5题:下一个排列 第6题:括号生成 第7题:删除并获得点数 第8题:全排列 第9题:颜色分类 第10 ...

  5. 算法面试不懂这6大数据结构知识一定挂!(附力扣LeetCode真题讲解)

    本文作者:苏勇,Google 资深技术工程师 首发地址:https://mp.weixin.qq.com/s/u8pvmupISQ5D4kGIkgfKbA 在互联网行业的算法面试中经常会被考到数据结构 ...

  6. Leetcode-How-What 力扣Leetcode刷题指南

    Leetcode-How-What 力扣Leetcode刷题指南 About the way how to use Leetcode wisely for preparing the intervie ...

  7. 【JAVA】交错字符串——力扣每日一题(六)(2020.07.18)

    目录 题目:97. 交错字符串 思路 如果你从本文中学习到丝毫知识,那么请您点点关注.点赞.评论和收藏 大家好,我是爱做梦的鱼,我是东北大学大数据实验班大三的小菜鸡,非常渴望优秀,羡慕优秀的人,个人博 ...

  8. leetcode 力扣每日一题系列详解——总目录

    这是总目录,该系列持续更新中........ leetcode 力扣每日一题系列详解--总目录

  9. 【爬虫】力扣每日一题每天自动邮件提醒!!!

    使用python实现了一个力扣每日一题每天自动邮件提醒的小爬虫,小但实用!!! 文章目录 A.需求来源与分析 B.技术角度分析 C.具体分析步骤 1.接口协议分析 2.发邮件 3.写crontab放服 ...

最新文章

  1. Juniper SRX340防火墙恢复出厂设置
  2. 微信小程序align_微信小程序四色花瓣
  3. SVM(二)从拉格朗日对偶问题到SVM
  4. rocketmq原理_彻底看懂RocketMQ事务实现原理
  5. 洛谷P2734 游戏 A Game
  6. java 使用logback进行日志输出
  7. 计算机网络学习笔记(5. 电路交换)
  8. 统计学习方法读书笔记4-感知机课后习题
  9. 计算机硬盘磁道损坏有什么症状,硬盘0磁道(0磁道)损坏的维修方法
  10. 老师常用选择题,选择框,单选框,以及各行业产品配置表单选配置明细等
  11. linux 命令chmod 755的意思
  12. 自定义Unity调色板
  13. Docker Linux下安装配置及启动
  14. idea2022报错: No appropriate protocol (protocol is disabled or cipher suites are inappropriate)
  15. DNS知识及域名解析内容深入浅出超详细总结附DNS配置教程
  16. Django分页+增删改查
  17. 某喷码机品牌U盘存储的配置文件简记
  18. 关于ANCII和UNICODE
  19. Python报错:NameError: name 'reduce' is not defined 和 reduce()函数介绍
  20. RTOS bookmark

热门文章

  1. ASUS R556L华硕老笔记升级,换固态硬盘,鸟枪换炮记:买固态硬盘的纠结和艰辛的系统迁移(前后花了三天时间)
  2. 路由器连接路由器怎么设置
  3. kettle使用 - 开启Carte服务
  4. 电脑php的基本方法是什么,做文员的基本电脑操作是什么
  5. SIM7600X常用指令
  6. java curator_关于Curator学习过程问题
  7. 华为路由器交换机命令汇总-持续更新
  8. 进制转换(未完待续)
  9. 基于SSM的学生考勤管理系统的设计与实现
  10. adb 通过 无线连接手机