Leetcode 236. Lowest Common Ancestor of a Binary Tree

举报
xindoo 发表于 2022/04/15 23:11:02 2022/04/15
【摘要】 题目链接 236. Lowest Common Ancestor of a Binary Tree   根据LCA的定义,二叉树中最小公共祖先就是两个节点p和q最近的共同祖先节点,LCA的定...

题目链接 236. Lowest Common Ancestor of a Binary Tree

  根据LCA的定义,二叉树中最小公共祖先就是两个节点p和q最近的共同祖先节点,LCA的定义没什么好解释的,主要是这道题的解法。
  我们要找p和q的最小公共节点,我开始想到的方法是先找出root分别到p和q的路径,既然路径都知道了,就从两条路径的末尾倒着往前来,第一个共同节点就是LCA,但其实有更简单易懂的方法。
  对于任意一个p和q的祖先节点node,都有三种情况,情况一:p和q的LCA在node的左子树,情况二:p和q的LCA在node的右子树,情况三:node就是p和q的LCA。
  说到递归,肯定是有边界条件的,这里的边界条件除了递归到叶子节点外,还有就是到达p或q,因为你p或者q的子孙节点不可能是p和q的LCA。在代码实现过程中,如果没到递归边界,我们先从左子树找LCA,比如找到了liftLCA。再从从右子树找LCA,比如找到了rightLCA。
  这里有几种情况:(1). liftLCA和rightLCA都不为空,肯定liftLCA和rightLCA分别是p和q,所以当然root节点肯定是LCA。(2).liftLCA和rightLCA其中之一为空,可能是在左子树或者又子树中找到了LCA,直接返回非空的一个。(3).liftLCA和rightLCA其中之一为空,还有可能是当前root节点的左右子树只包含p或q节点其中之一,这种情况递归回溯到上层是就会最终变成情况(1)或(2)。
  我的解题代码如下(Run Time:12ms)

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if (null == root) {
            return null;
        }
        if (root == p || root == q) {  //递归边界
            return root;
        }
        TreeNode liftLCA = lowestCommonAncestor(root.left, p, q);
        TreeNode rightLCA = lowestCommonAncestor(root.right, p,  q);
        if (null != liftLCA && null != rightLCA) { //情况(1)
            return root;  
        } 
        return liftLCA != null ? liftLCA : rightLCA; //情况(2)(3)
    }
}
  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

文章来源: xindoo.blog.csdn.net,作者:xindoo,版权归原作者所有,如需转载,请联系作者。

原文链接:xindoo.blog.csdn.net/article/details/78577025

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。