-
-
Notifications
You must be signed in to change notification settings - Fork 359
/
Copy pathtree.rs
84 lines (70 loc) · 1.94 KB
/
tree.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
use std::collections::VecDeque;
#[derive(Debug)]
struct Node {
children: Vec<Node>,
value: u64,
}
fn dfs_recursive(n: &Node) {
println!("{}", n.value);
for child in &n.children {
dfs_recursive(child);
}
}
fn dfs_recursive_postorder(n: &Node) {
for child in &n.children {
dfs_recursive_postorder(child);
}
println!("{}", n.value);
}
fn dfs_recursive_inorder_btree(n: &Node) {
if n.children.len() == 2{
dfs_recursive_inorder_btree(&n.children[1]);
println!("{}", n.value);
dfs_recursive_inorder_btree(&n.children[0]);
} else if n.children.len() == 1 {
dfs_recursive_inorder_btree(&n.children[0]);
println!("{}", n.value);
} else if n.children.len() == 0 {
println!("{}", n.value);
} else {
println!("This is not a binary tree.");
}
}
fn dfs_stack(n: &Node) {
let mut stack = vec![n];
while let Some(current) = stack.pop() {
println!("{}", current.value);
stack.extend(¤t.children);
}
}
fn bfs_queue(n: &Node){
let mut queue = VecDeque::new();
queue.push_back(n);
while let Some(current) = queue.pop_front() {
println!("{}", current.value);
queue.extend(¤t.children);
}
}
fn create_tree(num_row: u64, num_child: u64) -> Node {
if num_row == 0 {
return Node { children: vec![], value: 0 };
}
let children = (0..num_child)
.map(|_| create_tree(num_row - 1, num_child))
.collect();
Node { children, value: num_row }
}
fn main() {
let root = create_tree(2, 3);
println!("Recursive DFS:");
dfs_recursive(&root);
println!("Stack DFS:");
dfs_stack(&root);
println!("Queue BFS:");
bfs_queue(&root);
println!("Recursive post-order DFS:");
dfs_recursive_postorder(&root);
println!("Recursive in-order DFS BTree:");
let root_binary = create_tree(3, 2);
dfs_recursive_inorder_btree(&root_binary);
}