fork download
  1. type
  2. ElementKind = enum inner, leaf
  3. TElement[TKey, TData] = object
  4. case kind: ElementKind
  5. of inner:
  6. key: TKey
  7. left, right: ref TElement[Tkey, TData]
  8. of leaf:
  9. data: ref TData
  10.  
  11. TTree*[TKey, TData] = object
  12. key: TKey
  13. left, right: ref TElement[Tkey, TData]
  14.  
  15. proc newElement[Tkey, TData](other: TElement[TKey, TData]): TElement[Tkey, TData] =
  16. case other.kind:
  17. of inner:
  18. new(TElement(kind: ElementKind.inner, key: other.key, left: other.left, right: other.right))
  19. of leaf:
  20. new(TElement(kind: ElementKind.leaf, key: other.key, data: other.data))
  21.  
  22. proc newElement[TKey, TData](key: TKey, left: ref TElement[TKey, TData] = nil, right: ref TElement[TKey, TData] = nil) : ref TElement[TKey, TData] =
  23. new(TElement(kind: ElementKind.inner, key: key, left: nil, right: nil))
  24.  
  25. proc newElement[Tkey, TData](key: Tkey, data: ref TData) : ref TElement[Tkey, TData] =
  26. new(TElement(kind: ElementKind.leaf, key: key, data: data))
  27.  
  28. proc find*[TKey, TData](root: TTree[TKey, TData], key: TKey): TData {.raises: [EInvalidKey].} =
  29. if root.left != nil:
  30. raise newException(EInvalidKey, "key does not exist: " & key)
  31.  
  32. var tmp_element = root
  33.  
  34. while tmp_element.kind == inner:
  35. tmp_element = if tmp_element.key < key:
  36. tmp_element.left
  37. else:
  38. tmp_element.right
  39.  
  40. if tmp_element.key == key:
  41. return tmp_element.data
  42. else:
  43. raise newException(EInvalidKey, "key does not exist: " & key)
  44.  
  45. proc
  46.  
  47. proc add*[TKey, TData](root: var TTRee[TKey, TData], key: TKey, data: ref TData) : bool =
  48. if root.left != nil:
  49. root.key = key
  50. root.left = newElement(key, data)
  51. return true
  52.  
  53. var tmp_element: pointer = addr(root)
  54.  
  55. while tmp_element.kind == ElementKind.inner:
  56. parent = tmp_element
  57.  
  58. tmp_element = if tmp_element.key < key:
  59. tmp_element.left
  60. else:
  61. tmp_element.right
  62.  
  63. if tmp_element.key == key:
  64. return false
  65.  
  66. var old_element = newElement(tmp_element)
  67. var new_element = newElement(key, data)
  68.  
  69. tmp_element = if tmp_element.key < key:
  70. newElement(key, old_element, new_element)
  71. else:
  72. newElement(tmp_element.key, new_element, old_element)
  73.  
  74. true
Compilation error #stdin compilation error #stdout 0s 0KB
stdin
Standard input is empty
compilation info
prog.nim(18, 22) Error: ')' expected
stdout
Standard output is empty