Skip to content

Commit 921dd10

Browse files
Create 235. 二叉搜索树的最近公共祖先.md
1 parent 0a4f23e commit 921dd10

File tree

1 file changed

+61
-0
lines changed

1 file changed

+61
-0
lines changed
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
#### 235. 二叉搜索树的最近公共祖先
2+
3+
难度:中等
4+
5+
---
6+
7+
给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。
8+
9+
[百度百科](https://baike.baidu.com/item/%E6%9C%80%E8%BF%91%E5%85%AC%E5%85%B1%E7%A5%96%E5%85%88/8918834?fr=aladdin)中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大( **一个节点也可以是它自己的祖先** )。”
10+
11+
例如,给定如下二叉搜索树:  root = \[6,2,8,0,4,7,9,null,null,3,5\]
12+
13+
![](https://assets.leetcode-cn.com/aliyun-lc-upload/uploads/2018/12/14/binarysearchtree_improved.png)
14+
15+
**示例 1:**
16+
17+
```
18+
输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 8
19+
输出: 6
20+
解释: 节点 2 和节点 8 的最近公共祖先是 6。
21+
```
22+
23+
**示例 2:**
24+
25+
```
26+
输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 4
27+
输出: 2
28+
解释: 节点 2 和节点 4 的最近公共祖先是 2, 因为根据定义最近公共祖先节点可以为节点本身。
29+
```
30+
31+
**说明:**
32+
33+
* 所有节点的值都是唯一的。
34+
* p、q 为不同节点且均存在于给定的二叉搜索树中。
35+
36+
---
37+
38+
迭代遍历:
39+
40+
根据二叉搜索树的特点,左子树的值比根节点小,左子树的值比根节点大。每次都将根节点和给定的 `p, q` 两个节点的值进行比较,再将根节点的左子树或右子树赋值给根节点,直到根节点的值在 `p``q` 节点值之间。因为不确定 `p` 还是 `q` 节点值的大小,所以使用根节点和两个节点差的乘积是否小于零判断。
41+
42+
```Java
43+
/**
44+
* Definition for a binary tree node.
45+
* public class TreeNode {
46+
* int val;
47+
* TreeNode left;
48+
* TreeNode right;
49+
* TreeNode(int x) { val = x; }
50+
* }
51+
*/
52+
53+
class Solution {
54+
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
55+
while((long)(root.val - p.val) * (long)(root.val - q.val) > 0){
56+
root = root.val < p.val ? root.right : root.left;
57+
}
58+
return root;
59+
}
60+
}
61+
```

0 commit comments

Comments
 (0)