关于leetcode:leetcode-236-Lowest-Common-Ancestor-of-a-Binary-Tree-中等

40次阅读

共计 1281 个字符,预计需要花费 4 分钟才能阅读完成。

一、题目粗心

给定一个二叉树, 找到该树中两个指定节点的最近公共先人。

百度百科中最近公共先人的定义为:“对于有根树 T 的两个节点 p、q,最近公共先人示意为一个节点 x,满足 x 是 p、q 的先人且 x 的深度尽可能大(一个节点也能够是它本人的先人)。”

示例 1:

输出:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1

输入:3

解释:节点 5 和节点 1 的最近公共先人是节点 3。

示例 2:

输出:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4

输入:5

解释:节点 5 和节点 4 的最近公共先人是节点 5。因为依据定义最近公共先人节点能够为节点自身。

示例 3:

输出:root = [1,2], p = 1, q = 2

输入:1

提醒:

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

起源:力扣(LeetCode)
链接:https://leetcode.cn/problems/…
著作权归领扣网络所有。商业转载请分割官网受权,非商业转载请注明出处。

二、解题思路

这是 二叉搜寻树的最近公共先人 这题的衍生题,这道题是一般的二叉树,不是二叉搜寻树,所以就不能利其特有的性质,只能在二叉树中来搜寻 p 和 q,而后从门路中找到最初一个雷同的节点即为父节点,能够用递归来实现,在递归函数中,首先看以后节点是否为空,若为空则间接返回空;若为 p 或 q 中的任一个,也间接返回当着节点;否则的话就对其左右子节点别离调用递归函数。这道题限度了 p 和 q 肯定都在二叉树中存在,那么如果以后节点不等于 p 或 q,p 和 q 要么别离位于左右子树中,要么同时位于左子树,或者同时位于右子树:

若 p 和 q 别离位于左右子树中,对于左右子节点调用递归函数,别离返回 p 和 q 节点的地位,而以后节点正好是 p 和 q 的最小独特父节点,间接返回以后节点即可

若 p 和 q 同时位于左子树,有两种状况,一种是 left 会返回 p 和 q 中较高的那个地位,而 right 会返回空,所以最终返回非空的 left 即可,还有一种状况是返回 p 和 q 最小父节点,就是说以后节点的左子树中的某个节点才是 p 和 q 的最小父节点,会被返回。

若 p 和 q 同时位于右子树,和位于同时位于左子树相似。

三、解题办法

3.1 Java 实现

public class Solution {public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {if (root == null || 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;}
        return left != null ? left : right;
    }
}

四、总结小记

  • 2022/10/10 世界之大,无奇不有

正文完
 0