Advertisement
Guest User

Untitled

a guest
Mar 20th, 2019
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.46 KB | None | 0 0
  1. use std::cmp::Ordering;
  2.  
  3. type NodePtr<T> = Option<Box<Node<T>>>;
  4.  
  5. #[derive(Debug)]
  6. pub struct Node<T>
  7. where
  8. T: Ord,
  9. {
  10. key: T,
  11. left: NodePtr<T>,
  12. right: NodePtr<T>,
  13. }
  14.  
  15. #[derive(Debug)]
  16. pub struct BST<T>
  17. where
  18. T: Ord,
  19. {
  20. root: NodePtr<T>,
  21. }
  22.  
  23. impl<T> BST<T>
  24. where
  25. T: Ord,
  26. {
  27. pub fn new() -> BST<T> {
  28. BST { root: None }
  29. }
  30.  
  31. pub fn find(&self, v: &T) -> &NodePtr<T> {
  32. let mut cur = &self.root;
  33.  
  34. while let Some(node) = cur {
  35. match node.key.cmp(v) {
  36. Ordering::Equal => return cur,
  37. Ordering::Less => cur = &node.right,
  38. Ordering::Greater => cur = &node.left,
  39. };
  40. }
  41.  
  42. &None
  43. }
  44.  
  45. pub fn insert(&mut self, val: T) {
  46. if let Some(_) = self.find(&val) {
  47. return;
  48. }
  49.  
  50. let mut cur = &mut self.root;
  51. while let Some(node) = cur {
  52. match node.key.cmp(&val) {
  53. Ordering::Less | Ordering::Equal => cur = &mut node.right,
  54. Ordering::Greater => cur = &mut node.left,
  55. };
  56. }
  57.  
  58. cur.replace(Box::from(Node {
  59. key: val,
  60. left: None,
  61. right: None,
  62. }));
  63. }
  64. }
  65.  
  66. fn main() {
  67. let mut bst: BST<i32> = BST::new();
  68. bst.insert(8);
  69. bst.insert(3);
  70. bst.insert(10);
  71. bst.insert(5);
  72. bst.insert(5);
  73.  
  74. println!("{:?}", bst.find(&5));
  75. println!("{:?}", bst.find(&10));
  76. println!("{:?}", bst.find(&7));
  77. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement