FazBrowse GitHub Viewer
|
Trending
|
URL:
|
Home
Tools:
[Download Repo ZIP]
[View Raw Code]
[Original HTTPS Page]
algorithm/Week_02/id_16/LeetCode_236_16.java at master · algorithm001/algorithm · GitHub
algorithm001
/
algorithm
Public
Notifications
You must be signed in to change notification settings
Fork
148
Star
118
Code
Issues
548
Pull requests
46
Actions
Projects
Wiki
Security and quality
0
Insights
Additional navigation options
Code
Issues
Pull requests
Actions
Projects
Wiki
Security and quality
Insights
Expand file tree
Breadcrumbs
algorithm
/
Week_02
/
id_16
/
LeetCode_236_16.java
Copy path
More file actions
More file actions
Latest commit
History
History
History
59 lines (50 loc) · 2.07 KB
Breadcrumbs
algorithm
/
Week_02
/
id_16
/
LeetCode_236_16.java
Copy path
File metadata and controls
59 lines (50 loc) · 2.07 KB
Raw
Copy raw file
Download raw file
Open symbols panel
Edit and raw actions
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
/**[二叉树][中等]
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4]
示例 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。因为根据定义最近公共祖先节点可以为节点本身。
说明:
所有节点的值都是唯一的。
p、q 为不同节点且均存在于给定的二叉树中。
*/
/*
思路1:
问题的求解和子问题的求解相同,自然想到用递归实现。
若根节点为null,则解为null
若根节点等于p或q,则解为根节点
若不符合前两条,则解肯定出现在,左子树和右子树中,这样就有了递归公式。
对左右子树分别求最近公共祖先
将得到的结果分情况讨论,问题得解。
思考:如果二叉树是二叉搜索树,是否可以有不同解法。
*/
/**
* 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
(
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
null
;
}
else
if
(
left
!=
null
&&
right
!=
null
){
//p,q 节点分别在左右子树之中
return
root
;
}
else
{
return
left
!=
null
?
left
:
right
;
}
}
}
Back
|
FazBrowse Home
|
New Git URL