Skip to content

Commit 3bda2e9

Browse files
committed
20240225
1 parent 933079e commit 3bda2e9

File tree

1 file changed

+64
-0
lines changed

1 file changed

+64
-0
lines changed

src/tree/traversal/in_order.rs

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,13 +124,77 @@ pub fn closest_nodes(root: Option<Rc<RefCell<TreeNode>>>, queries: Vec<i32>) ->
124124
result
125125
}
126126

127+
/// [235. 二叉搜索树的最近公共祖先](https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-search-tree/description/)
128+
///
129+
/// ## 思路
130+
/// 由于是二叉搜索树, 因此只需要找到一个能将两个值左右分割的点即可, 不用存储父节点的栈
131+
pub fn lowest_common_ancestor(
132+
root: Option<Rc<RefCell<TreeNode>>>,
133+
p: Option<Rc<RefCell<TreeNode>>>,
134+
q: Option<Rc<RefCell<TreeNode>>>,
135+
) -> Option<Rc<RefCell<TreeNode>>> {
136+
let p = p.unwrap().borrow().val;
137+
let q = q.unwrap().borrow().val;
138+
139+
let mut node = root;
140+
while let Some(inner) = node {
141+
let v = inner.borrow().val;
142+
if p < v && q < v {
143+
node = inner.borrow().left.clone();
144+
} else if p > v && q > v {
145+
node = inner.borrow().right.clone();
146+
} else {
147+
return Some(inner);
148+
}
149+
}
150+
None
151+
}
127152
#[cfg(test)]
128153
mod tests {
129154
use crate::vec2;
130155

131156
use super::*;
132157
use macros::tree;
133158

159+
#[test]
160+
fn test_lowest_common_ancestor() {
161+
struct Testcase {
162+
tree: Option<Rc<RefCell<TreeNode>>>,
163+
p: Option<Rc<RefCell<TreeNode>>>,
164+
q: Option<Rc<RefCell<TreeNode>>>,
165+
expect: Option<Rc<RefCell<TreeNode>>>,
166+
}
167+
168+
vec![
169+
Testcase {
170+
tree: tree!({6, left: {2, left: {0}, right: {4, left: {3}, right: {5}}}, right: {8, left: {7}, right: {9}}}),
171+
p: tree!({2}),
172+
q: tree!({8}),
173+
expect: tree!({6}),
174+
},
175+
Testcase {
176+
tree: tree!({6, left: {2, left: {0}, right: {4, left: {3}, right: {5}}}, right: {8, left: {7}, right: {9}}}),
177+
p: tree!({2}),
178+
q: tree!({4}),
179+
expect: tree!({2}),
180+
},
181+
]
182+
.into_iter()
183+
.enumerate()
184+
.for_each(|(idx, testcase)| {
185+
let Testcase {
186+
tree,
187+
p,
188+
q,
189+
expect,
190+
} = testcase;
191+
let acutal = lowest_common_ancestor(tree, p, q);
192+
let actual_val = acutal.map(|x| x.borrow().val).unwrap();
193+
let expect_val = expect.map(|x| x.borrow().val).unwrap();
194+
assert_eq!(expect_val, actual_val, "case {} failed", idx);
195+
});
196+
}
197+
134198
#[test]
135199
fn test_closest_nodes() {
136200
struct TestCase {

0 commit comments

Comments
 (0)