Skip to content

Commit f11e769

Browse files
committed
[0212]ADD:Lc-119
1 parent 5edcdc5 commit f11e769

File tree

2 files changed

+65
-1
lines changed

2 files changed

+65
-1
lines changed

readme.md

+5-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@
77
[[20210204]107. 二叉树的层序遍历 II-Easy](树/107.%20二叉树的层序遍历%20II-Easy.md)
88
[[20210204]637. 二叉树的层平均值-Easy](树/637.%20二叉树的层平均值-Easy.md)
99
[[20210204]429. N 叉树的层序遍历-Medium](树/429.%20N%20叉树的层序遍历-Medium.md)
10-
[[20210204]1161. 最大层内元素和-Medium](1161.%20最大层内元素和-Medium.md)
10+
[[20210204]1161. 最大层内元素和-Medium](树/1161.%20最大层内元素和-Medium.md)
11+
[[20210212]119. 杨辉三角 II-Easy](动态规划/119.%20杨辉三角%20II-Easy.md)
12+
[[20210212]236. 二叉树的最近公共祖先-Medium](树/236.%20二叉树的最近公共祖先-Medium.md)
1113
## 2021.01
1214
[[20210104]1688. 比赛中的配对次数-Easy](回溯法/1688.%20比赛中的配对次数-Easy.md)
1315
[[20210105]830. 较大分组的位置-Easy](字符串/830.%20较大分组的位置-Easy.md)
@@ -98,6 +100,7 @@
98100
[129. 求根到叶子节点数字之和-Medium](树/129.%20求根到叶子节点数字之和-Medium.md)
99101
[144. 二叉树的前序遍历-Medium](树/144.%20二叉树的前序遍历-Medium.md)
100102
[235. 二叉搜索树的最近公共祖先-Easy](./树/235.%20二叉搜索树的最近公共祖先-Easy.md)
103+
[236. 二叉树的最近公共祖先-Medium](树/236.%20二叉树的最近公共祖先-Medium.md)
101104
[297. 二叉树的序列化与反序列化-Hard](树/297.%20二叉树的序列化与反序列化-Hard.md)
102105
[429. N 叉树的层序遍历-Medium](树/429.%20N%20叉树的层序遍历-Medium.md)
103106
[449. 序列化和反序列化二叉搜索树-Medium](树/449.%20序列化和反序列化二叉搜索树-Medium.md)
@@ -177,6 +180,7 @@
177180
[53. 最大子序和-Easy](动态规划/53.%20最大子序和-Easy.md)
178181
[62. 不同路径-Medium](动态规划/62.%20不同路径-Medium.md)
179182
[118. 杨辉三角-Easy](动态规划/118.%20杨辉三角-Easy.md)
183+
[119. 杨辉三角 II-Easy](动态规划/119.%20杨辉三角%20II-Easy.md)
180184
[292. Nim 游戏-Easy](动态规划/292.%20Nim%20游戏-Easy.md)
181185
[338. 比特位计数-Medium](动态规划/338.%20比特位计数-Medium.md)
182186
[746. 使用最小花费爬楼梯-Easy](动态规划/746.%20使用最小花费爬楼梯-Easy.md)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
# [Description](https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-tree)
2+
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
3+
4+
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
5+
6+
 
7+
8+
示例 1:
9+
10+
![](https://assets.leetcode.com/uploads/2018/12/14/binarytree.png)
11+
12+
```python
13+
输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1
14+
输出:3
15+
解释:节点 5 和节点 1 的最近公共祖先是节点 3
16+
```
17+
示例 2:
18+
19+
![](https://assets.leetcode.com/uploads/2018/12/14/binarytree.png)
20+
```python
21+
输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4
22+
输出:5
23+
解释:节点 5 和节点 4 的最近公共祖先是节点 5 。因为根据定义最近公共祖先节点可以为节点本身。
24+
```
25+
示例 3:
26+
```python
27+
输入:root = [1,2], p = 1, q = 2
28+
输出:1
29+
```
30+
31+
提示:
32+
33+
- 树中节点数目在范围 [2, 105] 内。
34+
- -109 <= Node.val <= 109
35+
- 所有 Node.val 互不相同 。
36+
- p != q
37+
- p 和 q 均存在于给定的二叉树中。
38+
39+
# Solution
40+
- 时间复杂度:$O(n)$
41+
- 空间复杂度:$O(n)$
42+
43+
```python
44+
class Solution:
45+
def lowestCommonAncestor(self, root: TreeNode, p: TreeNode, q: TreeNode) -> TreeNode:
46+
# 函数的意义为:以root为根节点的子树中是否包含p或q
47+
# 若包含,则返回值为对应节点;反之,则返回值为None
48+
if not root or root == p or root == q:
49+
return root
50+
51+
left = self.lowestCommonAncestor(root.left, p, q)
52+
right = self.lowestCommonAncestor(root.right, p, q)
53+
54+
if not left:
55+
return right
56+
if not right:
57+
return left
58+
59+
return root
60+
```

0 commit comments

Comments
 (0)