namespace tree {
data_t& BinaryTree::find(key_t key) {
if(!root_.is_not_leaf()) {
throw not_found_exception();
}
element_t* tmp_element = *root_;
do {
if(tmp_element->key() < tmp_element.left().key()) {
tmp_element = tmp_element->left();
} else {
tmp_element = tmp_element->right();
}
} while(tmp_element.is_not_leaf());
if(tmp_element->key() == key) {
return tmp_element->data();
} else {
throw not_found_exception(key);
}
}
} // end tree namespace
Cm5hbWVzcGFjZSB0cmVlIHsKCmRhdGFfdCYgQmluYXJ5VHJlZTo6ZmluZChrZXlfdCBrZXkpIHsKICAgIGlmKCFyb290Xy5pc19ub3RfbGVhZigpKSB7CiAgICAgIHRocm93IG5vdF9mb3VuZF9leGNlcHRpb24oKTsKICAgIH0KICAgIAogICAgZWxlbWVudF90KiB0bXBfZWxlbWVudCA9ICpyb290XzsKICAgIGRvIHsKICAgICAgaWYodG1wX2VsZW1lbnQtPmtleSgpIDwgdG1wX2VsZW1lbnQubGVmdCgpLmtleSgpKSB7Cgl0bXBfZWxlbWVudCA9IHRtcF9lbGVtZW50LT5sZWZ0KCk7CiAgICAgIH0gZWxzZSB7Cgl0bXBfZWxlbWVudCA9IHRtcF9lbGVtZW50LT5yaWdodCgpOwogICAgICB9CiAgICB9IHdoaWxlKHRtcF9lbGVtZW50LmlzX25vdF9sZWFmKCkpOwogICAgCiAgICBpZih0bXBfZWxlbWVudC0+a2V5KCkgPT0ga2V5KSB7CiAgICAgIHJldHVybiB0bXBfZWxlbWVudC0+ZGF0YSgpOwogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgbm90X2ZvdW5kX2V4Y2VwdGlvbihrZXkpOwogICAgfQp9Cgp9IC8vIGVuZCB0cmVlIG5hbWVzcGFjZQo=