2019-11-02 12:07:41 +08:00
|
|
|
|
# 68. 树中两个节点的最低公共祖先
|
|
|
|
|
|
|
|
|
|
|
2019-11-03 09:34:33 +08:00
|
|
|
|
## 68.1 二叉查找树
|
|
|
|
|
|
|
|
|
|
### 题目链接
|
2019-11-02 12:07:41 +08:00
|
|
|
|
|
|
|
|
|
[Leetcode : 235. Lowest Common Ancestor of a Binary Search Tree](https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-search-tree/description/)
|
|
|
|
|
|
2019-11-03 09:34:33 +08:00
|
|
|
|
### 解题思路
|
|
|
|
|
|
|
|
|
|
在二叉查找树中,两个节点 p, q 的公共祖先 root 满足 root.val >= p.val && root.val <= q.val。
|
2019-11-02 12:07:41 +08:00
|
|
|
|
|
2019-12-06 00:29:51 +08:00
|
|
|
|
<div align="center"> <img src="pics/047faac4-a368-4565-8331-2b66253080d3.jpg" width="250"/> </div><br>
|
2019-11-02 12:07:41 +08:00
|
|
|
|
|
|
|
|
|
```java
|
|
|
|
|
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
|
|
|
|
|
if (root == null)
|
|
|
|
|
return root;
|
|
|
|
|
if (root.val > p.val && root.val > q.val)
|
|
|
|
|
return lowestCommonAncestor(root.left, p, q);
|
|
|
|
|
if (root.val < p.val && root.val < q.val)
|
|
|
|
|
return lowestCommonAncestor(root.right, p, q);
|
|
|
|
|
return root;
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
2019-11-03 09:34:33 +08:00
|
|
|
|
## 68.2 普通二叉树
|
|
|
|
|
|
|
|
|
|
### 题目链接
|
2019-11-02 12:07:41 +08:00
|
|
|
|
|
|
|
|
|
[Leetcode : 236. Lowest Common Ancestor of a Binary Tree](https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-tree/description/)
|
|
|
|
|
|
2019-11-03 09:34:33 +08:00
|
|
|
|
### 解题思路
|
|
|
|
|
|
2019-11-02 12:07:41 +08:00
|
|
|
|
在左右子树中查找是否存在 p 或者 q,如果 p 和 q 分别在两个子树中,那么就说明根节点就是最低公共祖先。
|
|
|
|
|
|
2019-12-06 00:29:51 +08:00
|
|
|
|
<div align="center"> <img src="pics/d27c99f0-7881-4f2d-9675-c75cbdee3acd.jpg" width="250"/> </div><br>
|
2019-11-02 12:07:41 +08:00
|
|
|
|
|
|
|
|
|
```java
|
|
|
|
|
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);
|
|
|
|
|
return left == null ? right : right == null ? left : root;
|
|
|
|
|
}
|
|
|
|
|
```
|
2019-11-02 14:39:13 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2019-11-02 17:33:10 +08:00
|
|
|
|
<div align="center"><img width="320px" src="https://cs-notes-1256109796.cos.ap-guangzhou.myqcloud.com/githubio/公众号二维码-2.png"></img></div>
|