我需要在二叉搜索树中找到有序后继。例如,给定格式为的树:
4
/ \
2 7
并传递搜索值2,有序后继将为4.
相关守则:
template <typename T, typename Compare=std::less<T>>class BinarySearchTree {
private:
struct Node {
// Default constructor - does nothing
Node() {}
// Custom constructor provided for convenience
Node(const T &datum_in, Node *left_in, Node *right_in)
: datum(datum_in), left(left_in), right(right_in) { }
T datum;
Node *left;
Node *right;
};
这是我的功能,搜索有序继任者
static Node * min_greater_than_impl(Node *node, const T &val, Compare less) {
// base case: empty tree
if (node == nullptr) {
return nullptr;
}
// base case: no such element exists
if (less((max_element_impl(node))->datum, val) || (!less((max_element_impl(node))->datum, val)
&& !less(val, (max_element_impl(node))->datum))){
return nullptr;
}
// recursive case: go right
if (less(node->datum, val)) {
if (node->right != nullptr) {
return min_greater_than_impl(node->right, val, less);
}
}
// recursive case: go left
else if (less(val, node->datum)) {
if (node->left != nullptr) {
return min_greater_than_impl(node->left, val, less);
}
}
// recurisve case: nequal to node, go right
else {
if (node->right != nullptr) {
return min_greater_than_impl(node->right, val, less);
}
}
return node;
}
现在,我认为问题是我的功能无法识别它何时实际位于所需节点。我认为我需要检查这个可能是一个额外的基本情况,或者可能是另一个if函数末尾的语句。但是,我无法在不对当前节点进行递归调用的情况下考虑如何执行此操作,但这最终会在无限循环中结束。
答案 0 :(得分:0)
最简单的方法是添加父指针。然后去“下一步”,直到找到兄弟姐妹。
如果您不能使用父级,通常有充分的理由(例如,树允许重复的子分支),您必须在下降时保留自己的父对象堆栈。为了获得下一个对象,如果我们是左叶,那么它是父叶,如果我们是右叶,那么如果父叶是左叶,那么它是祖父母,否则我们需要上去检查祖父母是否是左曾祖父母的叶子。 (如果我们点击了根,那么我们的节点就是最后一个正确的叶子。)