Skip to content

Commit 8f917ea

Browse files
author
turtletongue
committed
feat: binary tree traversal
1 parent a910a26 commit 8f917ea

File tree

2 files changed

+66
-11
lines changed

2 files changed

+66
-11
lines changed

src/bin/main.rs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use std::error::Error;
22

3-
use rust_data_structures::trees::BinarySearchTree;
3+
use rust_data_structures::trees::{TraversingOrder, BinarySearchTree};
44

55
fn main() -> Result<(), Box<dyn Error>> {
66
let mut tree = BinarySearchTree::new();
@@ -15,11 +15,8 @@ fn main() -> Result<(), Box<dyn Error>> {
1515
tree.insert(8);
1616
tree.insert(10);
1717
tree.insert(15);
18-
tree.insert(7);
19-
tree.insert(7);
2018

21-
println!("{}", tree.find(7));
22-
println!("{}", tree.find(15));
19+
tree.traverse(TraversingOrder::InOrder);
2320

2421
Ok(())
2522
}

src/trees.rs

Lines changed: 64 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use std::{cell::RefCell, rc::Rc, cmp::{Ord, Ordering}};
1+
use std::{cell::RefCell, rc::Rc, cmp::{Ord, Ordering}, fmt::Display};
22

33
type OptionalNode<T> = Option<Rc<RefCell<Node<T>>>>;
44

@@ -18,11 +18,17 @@ impl<T> Node<T> {
1818
}
1919
}
2020

21+
pub enum TraversingOrder {
22+
PreOrder,
23+
InOrder,
24+
PostOrder,
25+
}
26+
2127
pub struct BinarySearchTree<T> {
2228
root: OptionalNode<T>,
2329
}
2430

25-
impl<T: Ord> BinarySearchTree<T> {
31+
impl<T: Ord + Display> BinarySearchTree<T> {
2632
pub fn new() -> Self {
2733
Self {
2834
root: None,
@@ -32,8 +38,8 @@ impl<T: Ord> BinarySearchTree<T> {
3238
pub fn insert(&mut self, value: T) {
3339
let parent = self.find_free_parent(&value);
3440

35-
if let None = parent {
36-
if let None = self.root {
41+
if parent.is_none() {
42+
if self.root.is_none() {
3743
self.root = Self::create_optional_node(value);
3844
}
3945

@@ -56,8 +62,60 @@ impl<T: Ord> BinarySearchTree<T> {
5662
self.root.is_some() && self.find_free_parent(&value).is_none()
5763
}
5864

65+
pub fn traverse(&self, order: TraversingOrder) {
66+
let root = self.root.as_ref();
67+
68+
match order {
69+
TraversingOrder::PreOrder => Self::traverse_pre_order(root),
70+
TraversingOrder::InOrder => Self::traverse_in_order(root),
71+
TraversingOrder::PostOrder => Self::traverse_post_order(root),
72+
}
73+
}
74+
75+
fn traverse_pre_order(root: Option<&Rc<RefCell<Node<T>>>>) {
76+
if root.is_none() {
77+
return;
78+
}
79+
80+
let borrowed_root = root.unwrap().borrow();
81+
82+
println!("{}", borrowed_root.value);
83+
84+
Self::traverse_pre_order(borrowed_root.left_child.as_ref());
85+
86+
Self::traverse_pre_order(borrowed_root.right_child.as_ref());
87+
}
88+
89+
fn traverse_in_order(root: Option<&Rc<RefCell<Node<T>>>>) {
90+
if root.is_none() {
91+
return;
92+
}
93+
94+
let borrowed_root = root.unwrap().borrow();
95+
96+
Self::traverse_in_order(borrowed_root.left_child.as_ref());
97+
98+
println!("{}", borrowed_root.value);
99+
100+
Self::traverse_in_order(borrowed_root.right_child.as_ref());
101+
}
102+
103+
fn traverse_post_order(root: Option<&Rc<RefCell<Node<T>>>>) {
104+
if root.is_none() {
105+
return;
106+
}
107+
108+
let borrowed_root = root.unwrap().borrow();
109+
110+
Self::traverse_post_order(borrowed_root.left_child.as_ref());
111+
112+
Self::traverse_post_order(borrowed_root.right_child.as_ref());
113+
114+
println!("{}", borrowed_root.value);
115+
}
116+
59117
fn find_free_parent(&self, value: &T) -> OptionalNode<T> {
60-
if let None = self.root {
118+
if self.root.is_none() {
61119
return None;
62120
}
63121

@@ -73,7 +131,7 @@ impl<T: Ord> BinarySearchTree<T> {
73131
Ordering::Equal => return None,
74132
};
75133

76-
if let None = next {
134+
if next.is_none() {
77135
break;
78136
}
79137

0 commit comments

Comments
 (0)