美文网首页
236. 二叉树的最近公共祖先

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

作者: 水中的蓝天 | 来源:发表于2022-07-27 12:06 被阅读0次

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

给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。

注意 : 一个节点也可以是它自己的祖先

提示:
树中节点数目在范围 [2, 105] 内。
-109 <= Node.val <= 109
所有 Node.val 互不相同 。
p != q
p 和 q 均存在于给定的二叉树中。

题目解析:一个节点可以是自己的祖先,p和q一定是两个不同的节点 没有相等的可能

思路:递归遍历二叉树
在以root为根节点的二叉树中查找p q的最近公共祖先
会有4种情况:

  1. 如果p q同时存在于这棵二叉树中,就能成功返回它们的最近公共祖先
  2. 如果p q都不存在于这棵二叉树中,就返回null
  3. 如果只有p存在于这棵二叉树中,就返回p
  4. 如果只有q存在于这棵二叉树中,就返回q
    时间复杂度: O(n) 二叉树的所有节点有且只会被访问一次,因此时间复杂度为O(n)
    空间复杂度: O(n) 递归调用的栈深度取决于二叉树的高度,二叉树最坏情况下为一条链
时间复杂度: O(n)
空间复杂度:O(1)
class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {

        //特殊情况处理  根节点为空 或 p q 两个中的任意一个等于根节点 那么就返回root
        if(root == null || p == root ||q == root) return root;
         //以root.left为根节点 查找p、q的最近公共祖先
         TreeNode left = lowestCommonAncestor(root.left,p,q);
         //以root.rigth为跟节点 查找p、q的最近公共祖先
         TreeNode right = lowestCommonAncestor(root.right,p,q);
         
         //1. 左边右边各返回一个节点说明p、q分别在左右两侧,这时最近根节点就是root
         if(left != null && right != null) return  root;

        //2.left != null && right == null 左边找到最近公共祖先 返回 left
        //3.left == null && right == null 左右都没找到 返回 null 但right==null 所以返回right
        //4.left == null && right != null 右侧找到最近公共祖先 返回right
        //整合后可以用三目运算来表示
        return (left != null)?left:right;
         
    }
}

执行结果.png

相关文章

网友评论

      本文标题:236. 二叉树的最近公共祖先

      本文链接:https://www.haomeiwen.com/subject/wxetirtx.html