Skip to content

Commit 78650cf

Browse files
rust: binary tree right side view
1 parent ecba19c commit 78650cf

File tree

1 file changed

+105
-0
lines changed
  • rust/algorithms/others/binary_tree_right_side_view_nov_5_2024

1 file changed

+105
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
use std::{cell::RefCell, rc::Rc};
2+
3+
/// Given the root of a binary tree, imagine yourself standing on the right side of it, return the values of the nodes you can see ordered from top to bottom.
4+
///
5+
/// Example 1:
6+
//
7+
/// Input: root = [1,2,3,null,5,null,4]
8+
/// Output: [1,3,4]
9+
/// Example 2:
10+
//
11+
/// Input: root = [1,null,3]
12+
/// Output: [1,3]
13+
/// Example 3:
14+
//
15+
/// Input: root = []
16+
/// Output: []
17+
//
18+
/// Constraints:
19+
//
20+
/// The number of nodes in the tree is in the range [0, 100].
21+
/// -100 <= Node.val <= 100
22+
23+
#[derive(Debug, PartialEq, Eq)]
24+
struct TreeNode {
25+
val: i32,
26+
left: Option<Rc<RefCell<TreeNode>>>,
27+
right: Option<Rc<RefCell<TreeNode>>>,
28+
}
29+
30+
impl TreeNode {
31+
#[inline]
32+
fn new(val: i32) -> Self {
33+
TreeNode {
34+
val,
35+
left: None,
36+
right: None,
37+
}
38+
}
39+
}
40+
41+
fn right_side_view(root: Option<Rc<RefCell<TreeNode>>>) -> Vec<i32> {
42+
let mut nodes = Vec::new();
43+
do_right_side_view(root, &mut nodes, 0, &mut 0);
44+
nodes
45+
}
46+
47+
fn do_right_side_view(
48+
root: Option<Rc<RefCell<TreeNode>>>,
49+
nodes: &mut Vec<i32>,
50+
depth: usize,
51+
visited_depth: &mut usize,
52+
) {
53+
if let Some(node) = root {
54+
if depth == *visited_depth {
55+
nodes.push(node.borrow().val);
56+
*visited_depth += 1;
57+
}
58+
do_right_side_view(node.borrow().right.clone(), nodes, depth + 1, visited_depth);
59+
do_right_side_view(node.borrow().left.clone(), nodes, depth + 1, visited_depth);
60+
}
61+
}
62+
63+
fn main() {}
64+
65+
#[cfg(test)]
66+
mod tests {
67+
use super::*;
68+
69+
#[test]
70+
fn test_right_side_view() {
71+
let tree_1 = Some(Rc::new(RefCell::new(TreeNode {
72+
val: 1,
73+
left: None,
74+
right: Some(Rc::new(RefCell::new(TreeNode {
75+
val: 3,
76+
left: None,
77+
right: None,
78+
}))),
79+
})));
80+
assert_eq!(vec![1, 3], right_side_view(tree_1));
81+
82+
let tree_2 = Some(Rc::new(RefCell::new(TreeNode {
83+
val: 1,
84+
left: Some(Rc::new(RefCell::new(TreeNode {
85+
val: 2,
86+
left: None,
87+
right: Some(Rc::new(RefCell::new(TreeNode {
88+
val: 5,
89+
left: None,
90+
right: None,
91+
}))),
92+
}))),
93+
right: Some(Rc::new(RefCell::new(TreeNode {
94+
val: 3,
95+
left: None,
96+
right: Some(Rc::new(RefCell::new(TreeNode {
97+
val: 4,
98+
left: None,
99+
right: None,
100+
}))),
101+
}))),
102+
})));
103+
assert_eq!(vec![1, 3, 4], right_side_view(tree_2));
104+
}
105+
}

0 commit comments

Comments
 (0)