|
10 | 10 |
|
11 | 11 | <p>例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4]</p>
|
12 | 12 |
|
13 |
| -<p><img alt="" src="https://assets.leetcode-cn.com/aliyun-lc-upload/uploads/2018/12/15/binarytree.png" style="height: 190px; width: 200px;"></p> |
14 |
| - |
15 |
| -<p> </p> |
| 13 | + |
16 | 14 |
|
17 | 15 | <p><strong>示例 1:</strong></p>
|
18 | 16 |
|
|
42 | 40 | ## 解法
|
43 | 41 | <!-- 这里可写通用的实现逻辑 -->
|
44 | 42 |
|
| 43 | +根据“**最近公共祖先**”的定义,若 root 是 p, q 的最近公共祖先 ,则只可能为以下情况之一: |
| 44 | + |
| 45 | +- 如果 p 和 q 分别是 root 的左右节点,那么 root 就是我们要找的最近公共祖先; |
| 46 | +- 如果 p 和 q 都是 root 的左节点,那么返回 `lowestCommonAncestor(root.left, p, q)`; |
| 47 | +- 如果 p 和 q 都是 root 的右节点,那么返回 `lowestCommonAncestor(root.right, p, q)`。 |
| 48 | + |
| 49 | +**边界条件讨论**: |
| 50 | + |
| 51 | +- 如果 root 为 null,则说明我们已经找到最底了,返回 null 表示没找到; |
| 52 | +- 如果 root 与 p 相等或者与 q 相等,则返回 root; |
| 53 | +- 如果左子树没找到,递归函数返回 null,证明 p 和 q 同在 root 的右侧,那么最终的公共祖先就是右子树找到的结点; |
| 54 | +- 如果右子树没找到,递归函数返回 null,证明 p 和 q 同在 root 的左侧,那么最终的公共祖先就是左子树找到的结点。 |
45 | 55 |
|
46 | 56 | <!-- tabs:start -->
|
47 | 57 |
|
48 | 58 | ### **Python3**
|
49 | 59 | <!-- 这里可写当前语言的特殊实现逻辑 -->
|
50 | 60 |
|
51 | 61 | ```python
|
52 |
| - |
| 62 | +# Definition for a binary tree node. |
| 63 | +# class TreeNode: |
| 64 | +# def __init__(self, x): |
| 65 | +# self.val = x |
| 66 | +# self.left = None |
| 67 | +# self.right = None |
| 68 | + |
| 69 | +class Solution: |
| 70 | + def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode': |
| 71 | + if root is None or root == p or root == q: |
| 72 | + return root |
| 73 | + left = self.lowestCommonAncestor(root.left, p, q) |
| 74 | + right = self.lowestCommonAncestor(root.right, p, q) |
| 75 | + return right if left is None else (left if right is None else root) |
53 | 76 | ```
|
54 | 77 |
|
55 | 78 | ### **Java**
|
56 | 79 | <!-- 这里可写当前语言的特殊实现逻辑 -->
|
57 | 80 |
|
58 | 81 | ```java
|
59 |
| - |
| 82 | +/** |
| 83 | + * Definition for a binary tree node. |
| 84 | + * public class TreeNode { |
| 85 | + * int val; |
| 86 | + * TreeNode left; |
| 87 | + * TreeNode right; |
| 88 | + * TreeNode(int x) { val = x; } |
| 89 | + * } |
| 90 | + */ |
| 91 | +class Solution { |
| 92 | + public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { |
| 93 | + if (root == null || root == p || root == q) { |
| 94 | + return root; |
| 95 | + } |
| 96 | + TreeNode left = lowestCommonAncestor(root.left, p, q); |
| 97 | + TreeNode right = lowestCommonAncestor(root.right, p, q); |
| 98 | + return left == null ? right : (right == null ? left : root); |
| 99 | + } |
| 100 | +} |
60 | 101 | ```
|
61 | 102 |
|
62 | 103 | ### **...**
|
|
0 commit comments