type
ElementKind = enum inner, leaf
TElement[TKey, TData] = object
case kind: ElementKind
of inner:
key: TKey
left, right: ref TElement[Tkey, TData]
of leaf:
data: ref TData
TTree*[TKey, TData] = object
key: TKey
left, right: ref TElement[Tkey, TData]
proc newElement[Tkey, TData](other: TElement[TKey, TData]): TElement[Tkey, TData] =
case other.kind:
of inner:
new(TElement(kind: ElementKind.inner, key: other.key, left: other.left, right: other.right))
of leaf:
new(TElement(kind: ElementKind.leaf, key: other.key, data: other.data))
proc newElement[TKey, TData](key: TKey, left: ref TElement[TKey, TData] = nil, right: ref TElement[TKey, TData] = nil) : ref TElement[TKey, TData] =
new(TElement(kind: ElementKind.inner, key: key, left: nil, right: nil))
proc newElement[Tkey, TData](key: Tkey, data: ref TData) : ref TElement[Tkey, TData] =
new(TElement(kind: ElementKind.leaf, key: key, data: data))
proc find*[TKey, TData](root: TTree[TKey, TData], key: TKey): TData {.raises: [EInvalidKey].} =
if root.left != nil:
raise newException
(EInvalidKey
, "key does not exist: " & key
)
var tmp_element = root
while tmp_element.kind == inner:
tmp_element = if tmp_element.key < key:
tmp_element.left
else:
tmp_element.right
if tmp_element.key == key:
return tmp_element.data
else:
raise newException
(EInvalidKey
, "key does not exist: " & key
)
proc
proc add*[TKey, TData](root: var TTRee[TKey, TData], key: TKey, data: ref TData) : bool =
if root.left != nil:
root.key = key
root.left = newElement(key, data)
return true
var tmp_element: pointer = addr(root)
while tmp_element.kind == ElementKind.inner:
parent = tmp_element
tmp_element = if tmp_element.key < key:
tmp_element.left
else:
tmp_element.right
if tmp_element.key == key:
return false
var old_element = newElement(tmp_element)
var new_element = newElement(key, data)
tmp_element = if tmp_element.key < key:
newElement(key, old_element, new_element)
else:
newElement(tmp_element.key, new_element, old_element)
true
dHlwZQogIEVsZW1lbnRLaW5kID0gZW51bSBpbm5lciwgbGVhZgogIFRFbGVtZW50W1RLZXksIFREYXRhXSA9IG9iamVjdAogICAgY2FzZSBraW5kOiBFbGVtZW50S2luZAogICAgb2YgaW5uZXI6CiAgICAgIGtleTogVEtleQogICAgICBsZWZ0LCByaWdodDogcmVmIFRFbGVtZW50W1RrZXksIFREYXRhXQogICAgb2YgbGVhZjoKICAgICAgZGF0YTogcmVmIFREYXRhCiAgIAogIFRUcmVlKltUS2V5LCBURGF0YV0gPSBvYmplY3QKICAgIGtleTogVEtleQogICAgbGVmdCwgcmlnaHQ6IHJlZiBURWxlbWVudFtUa2V5LCBURGF0YV0KCnByb2MgbmV3RWxlbWVudFtUa2V5LCBURGF0YV0ob3RoZXI6IFRFbGVtZW50W1RLZXksIFREYXRhXSk6IFRFbGVtZW50W1RrZXksIFREYXRhXSA9CiAgY2FzZSBvdGhlci5raW5kOgogIG9mIGlubmVyOgogICAgbmV3KFRFbGVtZW50KGtpbmQ6IEVsZW1lbnRLaW5kLmlubmVyLCBrZXk6IG90aGVyLmtleSwgbGVmdDogb3RoZXIubGVmdCwgcmlnaHQ6IG90aGVyLnJpZ2h0KSkKICBvZiBsZWFmOgogICAgbmV3KFRFbGVtZW50KGtpbmQ6IEVsZW1lbnRLaW5kLmxlYWYsIGtleTogb3RoZXIua2V5LCBkYXRhOiBvdGhlci5kYXRhKSkKCnByb2MgbmV3RWxlbWVudFtUS2V5LCBURGF0YV0oa2V5OiBUS2V5LCBsZWZ0OiByZWYgVEVsZW1lbnRbVEtleSwgVERhdGFdID0gbmlsLCByaWdodDogcmVmIFRFbGVtZW50W1RLZXksIFREYXRhXSA9IG5pbCkgOiByZWYgVEVsZW1lbnRbVEtleSwgVERhdGFdID0KICBuZXcoVEVsZW1lbnQoa2luZDogRWxlbWVudEtpbmQuaW5uZXIsIGtleToga2V5LCBsZWZ0OiBuaWwsIHJpZ2h0OiBuaWwpKQoKcHJvYyBuZXdFbGVtZW50W1RrZXksIFREYXRhXShrZXk6IFRrZXksIGRhdGE6IHJlZiBURGF0YSkgOiByZWYgVEVsZW1lbnRbVGtleSwgVERhdGFdID0KICBuZXcoVEVsZW1lbnQoa2luZDogRWxlbWVudEtpbmQubGVhZiwga2V5OiBrZXksIGRhdGE6IGRhdGEpKQoKcHJvYyBmaW5kKltUS2V5LCBURGF0YV0ocm9vdDogVFRyZWVbVEtleSwgVERhdGFdLCBrZXk6IFRLZXkpOiBURGF0YSB7LnJhaXNlczogW0VJbnZhbGlkS2V5XS59ID0KICBpZiByb290LmxlZnQgIT0gbmlsOgogICAgcmFpc2UgbmV3RXhjZXB0aW9uKEVJbnZhbGlkS2V5LCAia2V5IGRvZXMgbm90IGV4aXN0OiAiICYga2V5KQoKICB2YXIgdG1wX2VsZW1lbnQgPSByb290CgogIHdoaWxlIHRtcF9lbGVtZW50LmtpbmQgPT0gaW5uZXI6CiAgICB0bXBfZWxlbWVudCA9IGlmIHRtcF9lbGVtZW50LmtleSA8IGtleToKICAgICAgICAgICAgICAgICAgICB0bXBfZWxlbWVudC5sZWZ0IAogICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHRtcF9lbGVtZW50LnJpZ2h0CiAgIAogIGlmIHRtcF9lbGVtZW50LmtleSA9PSBrZXk6CiAgICByZXR1cm4gdG1wX2VsZW1lbnQuZGF0YQogIGVsc2U6CiAgICByYWlzZSBuZXdFeGNlcHRpb24oRUludmFsaWRLZXksICJrZXkgZG9lcyBub3QgZXhpc3Q6ICIgJiBrZXkpCgpwcm9jIAoKcHJvYyBhZGQqW1RLZXksIFREYXRhXShyb290OiB2YXIgVFRSZWVbVEtleSwgVERhdGFdLCBrZXk6IFRLZXksIGRhdGE6IHJlZiBURGF0YSkgOiBib29sID0KICBpZiByb290LmxlZnQgIT0gbmlsOgogICAgcm9vdC5rZXkgPSBrZXkKICAgIHJvb3QubGVmdCA9IG5ld0VsZW1lbnQoa2V5LCBkYXRhKQogICAgcmV0dXJuIHRydWUKCiAgdmFyIHRtcF9lbGVtZW50OiBwb2ludGVyID0gYWRkcihyb290KQogIAogIHdoaWxlIHRtcF9lbGVtZW50LmtpbmQgPT0gRWxlbWVudEtpbmQuaW5uZXI6CiAgICBwYXJlbnQgPSB0bXBfZWxlbWVudAoKICAgIHRtcF9lbGVtZW50ID0gaWYgdG1wX2VsZW1lbnQua2V5IDwga2V5OgogICAgICAgICAgICAgICAgICAgIHRtcF9lbGVtZW50LmxlZnQKICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICB0bXBfZWxlbWVudC5yaWdodAoKICBpZiB0bXBfZWxlbWVudC5rZXkgPT0ga2V5OgogICAgcmV0dXJuIGZhbHNlCiAgCiAgdmFyIG9sZF9lbGVtZW50ID0gbmV3RWxlbWVudCh0bXBfZWxlbWVudCkKICB2YXIgbmV3X2VsZW1lbnQgPSBuZXdFbGVtZW50KGtleSwgZGF0YSkKICAKICB0bXBfZWxlbWVudCA9IGlmIHRtcF9lbGVtZW50LmtleSA8IGtleToKICAgICAgICAgICAgICAgICAgbmV3RWxlbWVudChrZXksIG9sZF9lbGVtZW50LCBuZXdfZWxlbWVudCkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgIG5ld0VsZW1lbnQodG1wX2VsZW1lbnQua2V5LCBuZXdfZWxlbWVudCwgb2xkX2VsZW1lbnQpCiAgCiAgdHJ1ZQ==