Advertisement
Guest User

Untitled

a guest
Jun 18th, 2019
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.26 KB | None | 0 0
  1. #[derive(Copy, Clone)]
  2. pub enum TraverseOrder {
  3. PreOrder,
  4. InOrder,
  5. PostOrder,
  6. }
  7.  
  8. // Visit a node
  9. pub trait Visitor<T> {
  10. fn visit(&mut self, t: &T);
  11. }
  12.  
  13. pub trait Traversable<T> {
  14. fn traverse<V: Visitor<T>>(&self, order: TraverseOrder, visitor: &mut V);
  15. }
  16.  
  17. pub struct TreeNode<T> {
  18. pub value: T,
  19. pub left: Option<Box<TreeNode<T>>>,
  20. pub right: Option<Box<TreeNode<T>>>,
  21. }
  22.  
  23. #[cfg(test)]
  24. mod test {
  25. use super::*;
  26.  
  27. fn make_tree() -> TreeNode<u32> {
  28. // 5
  29. // 3 8
  30. // 2 4 6 9
  31. // 1 7
  32. return TreeNode {
  33. value: 5,
  34. left: Some(Box::new(TreeNode {
  35. value: 3,
  36. left: Some(Box::new(TreeNode {
  37. value: 2,
  38. left: Some(Box::new(TreeNode {
  39. value: 1,
  40. left: None,
  41. right: None,
  42. })),
  43. right: None,
  44. })),
  45. right: Some(Box::new(TreeNode {
  46. value: 4,
  47. left: None,
  48. right: None,
  49. })),
  50. })),
  51. right: Some(Box::new(TreeNode {
  52. value: 8,
  53. left: Some(Box::new(TreeNode {
  54. value: 6,
  55. left: None,
  56. right: Some(Box::new(TreeNode {
  57. value: 7,
  58. left: None,
  59. right: None,
  60. })),
  61. })),
  62. right: Some(Box::new(TreeNode {
  63. value: 9,
  64. left: None,
  65. right: None,
  66. })),
  67. })),
  68. }
  69. }
  70.  
  71. fn make_tree_2() -> TreeNode<u32> {
  72. // 1
  73. // 2 4
  74. // 3 5
  75. return TreeNode {
  76. value: 1,
  77. left: Some(Box::new(TreeNode {
  78. value: 2,
  79. left: Some(Box::new(TreeNode {
  80. value: 3,
  81. left: None,
  82. right: None,
  83. })),
  84. right: None,
  85. })),
  86. right: Some(Box::new(TreeNode {
  87. value: 4,
  88. left: None,
  89. right: Some(Box::new(TreeNode {
  90. value: 5,
  91. left: None,
  92. right: None,
  93. })),
  94. })),
  95. }
  96. }
  97.  
  98. struct CollectorVisitor<T> {
  99. pub values: Vec<T>,
  100. }
  101.  
  102. impl<T: Clone> Visitor<T> for CollectorVisitor<T> {
  103. fn visit(&mut self, t: &T) {
  104. self.values.push(t.clone());
  105. }
  106. }
  107.  
  108. impl<T> TreeNode<T> {
  109. fn traverse<V: Visitor<T>>(&self, order: TraverseOrder, visitor: &mut V) {
  110. match order {
  111. TraverseOrder::PreOrder => {
  112. visitor.visit(&self.value);
  113. match self.left.as_ref() {
  114. Some(x) => x.traverse(TraverseOrder::PreOrder, visitor),
  115. None => (),
  116. }
  117. match self.right.as_ref() {
  118. Some(x) => x.traverse(TraverseOrder::PreOrder, visitor),
  119. None => (),
  120. }
  121. }
  122. TraverseOrder::InOrder => {
  123. match self.left.as_ref() {
  124. Some(x) => {
  125. x.traverse(TraverseOrder::InOrder, visitor);
  126. }
  127. None => (),
  128. }
  129. visitor.visit(&self.value);
  130. match self.right.as_ref() {
  131. Some(x) => {
  132. x.traverse(TraverseOrder::InOrder, visitor);
  133. }
  134. None => (),
  135. }
  136. }
  137. TraverseOrder::PostOrder => {
  138. match self.left.as_ref() {
  139. Some(x) => x.traverse(TraverseOrder::PostOrder, visitor),
  140. None => (),
  141. }
  142. match self.right.as_ref() {
  143. Some(x) => x.traverse(TraverseOrder::PostOrder, visitor),
  144. None => (),
  145. }
  146. visitor.visit(&self.value);
  147. }
  148. }
  149. }
  150. }
  151.  
  152. #[test]
  153. fn test_pre_order() {
  154. let mut collector = CollectorVisitor { values: Vec::<u32>::new() };
  155. let tree = make_tree();
  156. tree.traverse(TraverseOrder::PreOrder, &mut collector);
  157. assert_eq!(collector.values, vec![5, 3, 2, 1, 4, 8, 6, 7, 9]);
  158. }
  159.  
  160. #[test]
  161. fn test_in_order() {
  162. let mut collector = CollectorVisitor { values: Vec::<u32>::new() };
  163. let tree = make_tree();
  164. tree.traverse(TraverseOrder::InOrder, &mut collector);
  165. assert_eq!(collector.values, vec![1, 2, 3, 4, 5, 6, 7, 8, 9]);
  166. }
  167.  
  168. #[test]
  169. fn test_post_order() {
  170. let mut collector = CollectorVisitor { values: Vec::<u32>::new() };
  171. let tree = make_tree();
  172. tree.traverse(TraverseOrder::PostOrder, &mut collector);
  173. assert_eq!(collector.values, vec![1, 2, 4, 3, 7, 6, 9, 8, 5]);
  174. }
  175.  
  176. #[test]
  177. fn test_pre_order_2() {
  178. let mut collector = CollectorVisitor { values: Vec::<u32>::new() };
  179. let tree = make_tree_2();
  180. tree.traverse(TraverseOrder::PreOrder, &mut collector);
  181. assert_eq!(collector.values, vec![1, 2, 3, 4, 5]);
  182. }
  183.  
  184. #[test]
  185. fn test_in_order_2() {
  186. let mut collector = CollectorVisitor { values: Vec::<u32>::new() };
  187. let tree = make_tree_2();
  188. tree.traverse(TraverseOrder::InOrder, &mut collector);
  189. assert_eq!(collector.values, vec![3, 2, 1, 4, 5]);
  190. }
  191.  
  192. #[test]
  193. fn test_post_order_2() {
  194. let mut collector = CollectorVisitor { values: Vec::<u32>::new() };
  195. let tree = make_tree_2();
  196. tree.traverse(TraverseOrder::PostOrder, &mut collector);
  197. assert_eq!(collector.values, vec![3, 2, 5, 4, 1]);
  198. }
  199. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement