type
NodeKind = enum inner, leaf
TElement[TKey, TData] = object
case kind: NodeKind
of inner:
key: TKey
left, right: ref TElement[Tkey, TData]
of leaf:
data: ref TData
TTree*[TKey, TData] = distinct TElement[TKey, TData]
proc find*[TKey, TData](root: TTree[TKey, TData], key: TKey): TData {.raises: [EInvalidKey].} =
if root.kind != inner:
raise newException
(EInvalidKey
, "key does not exist: " & key
)
var tmp_element = root
while tmp_element.kind == inner:
if tmp_element.key < key:
tmp_element = tmp_element.left
else:
tmp_element = tmp_element.right
if tmp_element.key == key:
return tmp_element.data
else:
raise newException
(EInvalidKey
, "key does not exist: " & key
)
dHlwZQogIE5vZGVLaW5kID0gZW51bSBpbm5lciwgbGVhZgogIFRFbGVtZW50W1RLZXksIFREYXRhXSA9IG9iamVjdAogICAgY2FzZSBraW5kOiBOb2RlS2luZAogICAgb2YgaW5uZXI6CiAgICAgIGtleTogVEtleQogICAgICBsZWZ0LCByaWdodDogcmVmIFRFbGVtZW50W1RrZXksIFREYXRhXQogICAgb2YgbGVhZjoKICAgICAgZGF0YTogcmVmIFREYXRhCiAgCiAgVFRyZWUqW1RLZXksIFREYXRhXSA9IGRpc3RpbmN0IFRFbGVtZW50W1RLZXksIFREYXRhXQoKCnByb2MgZmluZCpbVEtleSwgVERhdGFdKHJvb3Q6IFRUcmVlW1RLZXksIFREYXRhXSwga2V5OiBUS2V5KTogVERhdGEgey5yYWlzZXM6IFtFSW52YWxpZEtleV0ufSA9CiAgICBpZiByb290LmtpbmQgIT0gaW5uZXI6CiAgICAgIHJhaXNlIG5ld0V4Y2VwdGlvbihFSW52YWxpZEtleSwgImtleSBkb2VzIG5vdCBleGlzdDogIiAmIGtleSkKCiAgICB2YXIgdG1wX2VsZW1lbnQgPSByb290CiAgICAKICAgIHdoaWxlIHRtcF9lbGVtZW50LmtpbmQgPT0gaW5uZXI6CiAgICAgIGlmIHRtcF9lbGVtZW50LmtleSA8IGtleToKICAgICAgICB0bXBfZWxlbWVudCA9IHRtcF9lbGVtZW50LmxlZnQKICAgICAgZWxzZToKICAgICAgICB0bXBfZWxlbWVudCA9IHRtcF9lbGVtZW50LnJpZ2h0CiAgICAKICAgIGlmIHRtcF9lbGVtZW50LmtleSA9PSBrZXk6CiAgICAgIHJldHVybiB0bXBfZWxlbWVudC5kYXRhCiAgICBlbHNlOgogICAgICByYWlzZSBuZXdFeGNlcHRpb24oRUludmFsaWRLZXksICJrZXkgZG9lcyBub3QgZXhpc3Q6ICIgJiBrZXkpCiAgICAKICA=