【问题标题】:Finding In-Order Successor in Binary Search tree Using Recursion使用递归在二叉搜索树中查找有序后继
【发布时间】:2017-04-25 16:33:13
【问题描述】:

我需要在二叉搜索树中找到有序后继。例如,给定一棵树,其格式为:

  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 语句中检查这一点。但是,如果不对当前节点进行递归调用,我想不出如何做到这一点,但这最终会陷入无限循环。

【问题讨论】:

标签: c++ recursion binary-tree binary-search-tree inorder


【解决方案1】:

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

如果您不能使用父对象,通常是有充分的理由(例如,树允许重复的子分支),您必须在下降时保留自己的父对象堆栈。要获取下一个对象,如果我们是左叶,它是父母,如果我们是右叶,那么如果父母是左叶,它是祖父母,否则我们需要上去检查祖父母是否是左曾祖父母的叶子。 (如果我们找到根,那么我们的节点就是最后一个右叶)。

【讨论】:

    猜你喜欢
    • 2014-06-11
    • 1970-01-01
    • 2021-06-24
    • 2014-01-02
    • 1970-01-01
    • 2021-07-03
    • 2019-04-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多