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: TData
TTree[TKey, TData] = distinct TElement[TKey, TData]
proc find*[TKey, TData](root: TTree[TKey, TData], key: TKey): TData {.raises: [EInvalidKey].} =
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
)
dHlwZQogIE5vZGVLaW5kID0gZW51bSBpbm5lciwgbGVhZgogIFRFbGVtZW50W1RLZXksIFREYXRhXSA9IG9iamVjdAogICAgY2FzZSBraW5kOiBOb2RlS2luZAogICAgb2YgaW5uZXI6CiAgICAgIGtleTogVEtleQogICAgICBsZWZ0LCByaWdodDogcmVmIFRFbGVtZW50W1RrZXksIFREYXRhXQogICAgb2YgbGVhZjoKICAgICAgZGF0YTogVERhdGEKICAKICBUVHJlZVtUS2V5LCBURGF0YV0gPSBkaXN0aW5jdCBURWxlbWVudFtUS2V5LCBURGF0YV0KCgoKcHJvYyBmaW5kKltUS2V5LCBURGF0YV0ocm9vdDogVFRyZWVbVEtleSwgVERhdGFdLCBrZXk6IFRLZXkpOiBURGF0YSB7LnJhaXNlczogW0VJbnZhbGlkS2V5XS59ID0KICAgIHZhciB0bXBfZWxlbWVudCA9IHJvb3QKICAgIAogICAgd2hpbGUgdG1wX2VsZW1lbnQua2luZCA9PSBpbm5lcjoKICAgICAgaWYgdG1wX2VsZW1lbnQua2V5IDwga2V5OgogICAgICAgIHRtcF9lbGVtZW50ID0gdG1wX2VsZW1lbnQubGVmdAogICAgICBlbHNlOgogICAgICAgIHRtcF9lbGVtZW50ID0gdG1wX2VsZW1lbnQucmlnaHQKICAgIAogICAgaWYgdG1wX2VsZW1lbnQua2V5ID09IGtleToKICAgICAgcmV0dXJuIHRtcF9lbGVtZW50LmRhdGEKICAgIGVsc2U6CiAgICAgIHJhaXNlIG5ld0V4Y2VwdGlvbihFSW52YWxpZEtleSwgImtleSBkb2VzIG5vdCBleGlzdDogIiAmIGtleSkKICAgIAogIA==