Skip to content

Commit 89bb146

Browse files
committed
make dfs same as c/c++ and other small improvement
1 parent 7d708b4 commit 89bb146

File tree

3 files changed

+38
-29
lines changed

3 files changed

+38
-29
lines changed

codes/rust/chapter_tree/array_binary_tree.rs

+2-9
Original file line numberDiff line numberDiff line change
@@ -49,18 +49,11 @@ impl ArrayBinaryTree {
4949

5050
/* 层序遍历 */
5151
fn level_order(&self) -> Vec<i32> {
52-
let mut res = vec![];
53-
// 直接遍历数组
54-
for i in 0..self.size() {
55-
if let Some(val) = self.val(i) {
56-
res.push(val)
57-
}
58-
}
59-
res
52+
self.tree.iter().filter_map(|&x| x).collect()
6053
}
6154

6255
/* 深度优先遍历 */
63-
fn dfs(&self, i: i32, order: &str, res: &mut Vec<i32>) {
56+
fn dfs(&self, i: i32, order: &'static str, res: &mut Vec<i32>) {
6457
if self.val(i).is_none() {
6558
return;
6659
}

codes/rust/chapter_tree/binary_search_tree.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ impl BinarySearchTree {
126126
// 删除节点 cur
127127
if !Rc::ptr_eq(&cur, self.root.as_ref().unwrap()) {
128128
let left = pre.borrow().left.clone();
129-
if left.is_some() && Rc::ptr_eq(&left.as_ref().unwrap(), &cur) {
129+
if left.is_some() && Rc::ptr_eq(left.as_ref().unwrap(), &cur) {
130130
pre.borrow_mut().left = child;
131131
} else {
132132
pre.borrow_mut().right = child;
@@ -147,11 +147,11 @@ impl BinarySearchTree {
147147
break;
148148
}
149149
}
150-
let tmpval = tmp.unwrap().borrow().val;
150+
let tmp_val = tmp.unwrap().borrow().val;
151151
// 递归删除节点 tmp
152-
self.remove(tmpval);
152+
self.remove(tmp_val);
153153
// 用 tmp 覆盖 cur
154-
cur.borrow_mut().val = tmpval;
154+
cur.borrow_mut().val = tmp_val;
155155
}
156156
}
157157
}

codes/rust/chapter_tree/binary_tree_dfs.rs

+32-16
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* Author: xBLACKICEx ([email protected])
55
*/
66

7-
use hello_algo_rust::include::{vec_to_tree, TreeNode, print_util};
7+
use hello_algo_rust::include::{print_util, vec_to_tree, TreeNode};
88
use hello_algo_rust::op_vec;
99

1010
use std::cell::RefCell;
@@ -14,38 +14,54 @@ use std::rc::Rc;
1414
fn pre_order(root: Option<&Rc<RefCell<TreeNode>>>) -> Vec<i32> {
1515
let mut result = vec![];
1616

17-
if let Some(node) = root {
18-
// 访问优先级:根节点 -> 左子树 -> 右子树
19-
result.push(node.borrow().val);
20-
result.extend(pre_order(node.borrow().left.as_ref()));
21-
result.extend(pre_order(node.borrow().right.as_ref()));
17+
fn dfs(root: Option<&Rc<RefCell<TreeNode>>>, res: &mut Vec<i32>) {
18+
if let Some(node) = root {
19+
// 访问优先级:根节点 -> 左子树 -> 右子树
20+
let node = node.borrow();
21+
res.push(node.val);
22+
dfs(node.left.as_ref(), res);
23+
dfs(node.right.as_ref(), res);
24+
}
2225
}
26+
dfs(root, &mut result);
27+
2328
result
2429
}
2530

2631
/* 中序遍历 */
2732
fn in_order(root: Option<&Rc<RefCell<TreeNode>>>) -> Vec<i32> {
2833
let mut result = vec![];
2934

30-
if let Some(node) = root {
31-
// 访问优先级:左子树 -> 根节点 -> 右子树
32-
result.extend(in_order(node.borrow().left.as_ref()));
33-
result.push(node.borrow().val);
34-
result.extend(in_order(node.borrow().right.as_ref()));
35+
fn dfs(root: Option<&Rc<RefCell<TreeNode>>>, res: &mut Vec<i32>) {
36+
if let Some(node) = root {
37+
// 访问优先级:左子树 -> 根节点 -> 右子树
38+
let node = node.borrow();
39+
dfs(node.left.as_ref(), res);
40+
res.push(node.val);
41+
dfs(node.right.as_ref(), res);
42+
}
3543
}
44+
dfs(root, &mut result);
45+
3646
result
3747
}
3848

3949
/* 后序遍历 */
4050
fn post_order(root: Option<&Rc<RefCell<TreeNode>>>) -> Vec<i32> {
4151
let mut result = vec![];
4252

43-
if let Some(node) = root {
44-
// 访问优先级:左子树 -> 右子树 -> 根节点
45-
result.extend(post_order(node.borrow().left.as_ref()));
46-
result.extend(post_order(node.borrow().right.as_ref()));
47-
result.push(node.borrow().val);
53+
fn dfs(root: Option<&Rc<RefCell<TreeNode>>>, res: &mut Vec<i32>) {
54+
if let Some(node) = root {
55+
// 访问优先级:左子树 -> 右子树 -> 根节点
56+
let node = node.borrow();
57+
dfs(node.left.as_ref(), res);
58+
dfs(node.right.as_ref(), res);
59+
res.push(node.val);
60+
}
4861
}
62+
63+
dfs(root, &mut result);
64+
4965
result
5066
}
5167

0 commit comments

Comments
 (0)