使用递归在二进制搜索树中查找固定后继

Finding In-Order Successor in Binary Search tree Using Recursion

本文关键字:查找 搜索树 递归 二进制      更新时间:2023-10-16

我需要在二进制搜索树中找到订购后继。例如,给定格式的树:

  4  
 /   
2   7  

并传递2个搜索值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;
}

现在,我相信问题是我的功能实际上何时在所需的节点上。我认为我需要在功能末尾的语句中可能在额外的基本案例或其他情况下检查一下。但是,如果不对当前节点进行递归电话,我无法想到该怎么做,但这只是无限循环。

最简单的方法是添加父指针。然后要获得"下一个",上升到找到兄弟姐妹。

如果您无法使用父母,通常出于充分的理由(例如,树允许重复的子分支),则必须在下降时保留自己的父对象堆栈。要获取下一个物体,如果我们是左叶,那是父母,如果我们是右叶曾祖父母的叶子。(如果我们碰到根,那么我们的节点是最后一个正确的叶子)。