1- use std:: { cell:: RefCell , rc:: Rc , cmp:: { Ord , Ordering } } ;
1+ use std:: { cell:: RefCell , rc:: Rc , cmp:: { Ord , Ordering } , fmt :: Display } ;
22
33type 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+
2127pub 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