@@ -124,13 +124,77 @@ pub fn closest_nodes(root: Option<Rc<RefCell<TreeNode>>>, queries: Vec<i32>) ->
124
124
result
125
125
}
126
126
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
+ }
127
152
#[ cfg( test) ]
128
153
mod tests {
129
154
use crate :: vec2;
130
155
131
156
use super :: * ;
132
157
use macros:: tree;
133
158
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
+
134
198
#[ test]
135
199
fn test_closest_nodes ( ) {
136
200
struct TestCase {
0 commit comments