-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmod.rs
More file actions
91 lines (82 loc) · 2.34 KB
/
mod.rs
File metadata and controls
91 lines (82 loc) · 2.34 KB
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
85
86
87
88
89
90
91
use std::cell::RefCell;
use std::rc::Rc;
/// https://leetcode.com/problems/merge-two-binary-trees/
#[allow(dead_code)]
pub struct TreeNode {
pub val: i32,
pub left: Option<Rc<RefCell<TreeNode>>>,
pub right: Option<Rc<RefCell<TreeNode>>>,
}
impl TreeNode {
#[allow(dead_code)]
pub fn new(val: i32) -> Self {
TreeNode {
val,
left: None,
right: None,
}
}
#[allow(dead_code)]
pub fn new_node(val: i32, left: Option<TreeNode>, right: Option<TreeNode>) -> Self {
TreeNode {
val,
left: if let Some(v) = left {
Some(Rc::new(RefCell::new(v)))
} else {
None
},
right: if let Some(v) = right {
Some(Rc::new(RefCell::new(v)))
} else {
None
},
}
}
}
#[allow(dead_code)]
pub fn merge_trees(
root1: Option<Rc<RefCell<TreeNode>>>,
root2: Option<Rc<RefCell<TreeNode>>>,
) -> Option<Rc<RefCell<TreeNode>>> {
fn inner(
r1: &Option<Rc<RefCell<TreeNode>>>,
r2: &Option<Rc<RefCell<TreeNode>>>,
) -> Option<Rc<RefCell<TreeNode>>> {
match (r1, r2) {
(Some(r1), Some(r2)) => {
let (l, r) = (r1.borrow(), r2.borrow());
let mut root = TreeNode::new(l.val + r.val);
root.left = inner(&l.left, &r.left);
root.right = inner(&l.right, &r.right);
Some(Rc::new(RefCell::new(root)))
},
(None, Some(r2)) => Some(r2.clone()),
(Some(r1), None) => Some(r1.clone()),
_ => None
}
}
return inner(&root1, &root2);
}
#[cfg(test)]
mod tests {
use super::TreeNode;
use std::cell::RefCell;
use std::rc::Rc;
#[test]
fn merge_trees_test() {
let root1 = TreeNode::new_node(
1,
Some(TreeNode::new_node(3, Some(TreeNode::new(5)), None)),
Some(TreeNode::new(2)),
);
let root2 = TreeNode::new_node(
2,
Some(TreeNode::new_node(1, None, Some(TreeNode::new(4)))),
Some(TreeNode::new_node(3, None, Some(TreeNode::new(7)))),
);
super::merge_trees(
Some(Rc::new(RefCell::new(root1))),
Some(Rc::new(RefCell::new(root2))),
);
}
}