Skip to content

Commit bde5149

Browse files
committed
feat: update rust solution to lcof problems: No.07,33
- 面试题07. 重建二叉树 - 面试题33. 二叉搜索树的后序遍历序列
1 parent b13b115 commit bde5149

File tree

4 files changed

+65
-6
lines changed

4 files changed

+65
-6
lines changed

lcof/面试题07. 重建二叉树/README.md

+7-3
Original file line numberDiff line numberDiff line change
@@ -279,18 +279,22 @@ function buildTree(preorder: number[], inorder: number[]): TreeNode | null {
279279
use std::rc::Rc;
280280
use std::cell::RefCell;
281281
impl Solution {
282-
pub fn build_tree(preorder: Vec<i32>, inorder: Vec<i32>) -> Option<Rc<RefCell<TreeNode>>> {
282+
fn help(preorder: &[i32], inorder: &[i32]) -> Option<Rc<RefCell<TreeNode>>> {
283283
if inorder.is_empty() {
284284
return None;
285285
}
286286
let val = preorder[0];
287287
let i = inorder.iter().position(|num| *num == val).unwrap();
288288
Some(Rc::new(RefCell::new(TreeNode {
289289
val,
290-
left: Self::build_tree(preorder[1..i + 1].to_vec(), inorder[..i].to_vec()),
291-
right: Self::build_tree(preorder[i + 1..].to_vec(), inorder[i + 1..].to_vec()),
290+
left: Self::help(&preorder[1..i + 1], &inorder[..i]),
291+
right: Self::help(&preorder[i + 1..], &inorder[i + 1..]),
292292
})))
293293
}
294+
295+
pub fn build_tree(preorder: Vec<i32>, inorder: Vec<i32>) -> Option<Rc<RefCell<TreeNode>>> {
296+
Self::help(&preorder, &inorder)
297+
}
294298
}
295299
```
296300

lcof/面试题07. 重建二叉树/Solution.rs

+7-3
Original file line numberDiff line numberDiff line change
@@ -19,16 +19,20 @@
1919
use std::rc::Rc;
2020
use std::cell::RefCell;
2121
impl Solution {
22-
pub fn build_tree(preorder: Vec<i32>, inorder: Vec<i32>) -> Option<Rc<RefCell<TreeNode>>> {
22+
fn help(preorder: &[i32], inorder: &[i32]) -> Option<Rc<RefCell<TreeNode>>> {
2323
if inorder.is_empty() {
2424
return None;
2525
}
2626
let val = preorder[0];
2727
let i = inorder.iter().position(|num| *num == val).unwrap();
2828
Some(Rc::new(RefCell::new(TreeNode {
2929
val,
30-
left: Self::build_tree(preorder[1..i + 1].to_vec(), inorder[..i].to_vec()),
31-
right: Self::build_tree(preorder[i + 1..].to_vec(), inorder[i + 1..].to_vec()),
30+
left: Self::help(&preorder[1..i + 1], &inorder[..i]),
31+
right: Self::help(&preorder[i + 1..], &inorder[i + 1..]),
3232
})))
3333
}
34+
35+
pub fn build_tree(preorder: Vec<i32>, inorder: Vec<i32>) -> Option<Rc<RefCell<TreeNode>>> {
36+
Self::help(&preorder, &inorder)
37+
}
3438
}

lcof/面试题33. 二叉搜索树的后序遍历序列/README.md

+28
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,34 @@ function verifyPostorder(postorder: number[]): boolean {
196196
}
197197
```
198198

199+
### **Rust**
200+
201+
```rust
202+
impl Solution {
203+
fn dfs(start: usize, end: usize, max_val: i32, postorder: &Vec<i32>) -> bool {
204+
if start >= end {
205+
return true;
206+
}
207+
let root_val = postorder[end - 1];
208+
for i in (start..end).rev() {
209+
let val = postorder[i];
210+
if val > max_val {
211+
return false;
212+
}
213+
if val < root_val {
214+
return Self::dfs(start, i, root_val, postorder)
215+
&& Self::dfs(i + 1, end - 1, max_val, postorder);
216+
}
217+
}
218+
Self::dfs(start, end - 1, max_val, postorder)
219+
}
220+
221+
pub fn verify_postorder(postorder: Vec<i32>) -> bool {
222+
Self::dfs(0, postorder.len(), i32::MAX, &postorder)
223+
}
224+
}
225+
```
226+
199227
### **...**
200228

201229
```
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
impl Solution {
2+
fn dfs(start: usize, end: usize, max_val: i32, postorder: &Vec<i32>) -> bool {
3+
if start >= end {
4+
return true;
5+
}
6+
let root_val = postorder[end - 1];
7+
for i in (start..end).rev() {
8+
let val = postorder[i];
9+
if val > max_val {
10+
return false;
11+
}
12+
if val < root_val {
13+
return Self::dfs(start, i, root_val, postorder)
14+
&& Self::dfs(i + 1, end - 1, max_val, postorder);
15+
}
16+
}
17+
Self::dfs(start, end - 1, max_val, postorder)
18+
}
19+
20+
pub fn verify_postorder(postorder: Vec<i32>) -> bool {
21+
Self::dfs(0, postorder.len(), i32::MAX, &postorder)
22+
}
23+
}

0 commit comments

Comments
 (0)