【问题标题】:Binary search tree method needed: find minimum value node需要二叉搜索树方法:找到最小值节点
【发布时间】:2013-05-23 09:14:54
【问题描述】:

任何人都可以帮助我做到这一点:我的二叉搜索树 ADT 需要一个公共方法,它返回对树中具有最小值的节点中的信息的引用。该方法的签名是:

公共T min()

A.设计该方法的交互版本。

B.设计该方法的递归版本。

C.哪种方法更好?请解释一下。

这不是硬件或任何东西,这是我自己的练习。

【问题讨论】:

  • 所以在您的迭代解决方案中,您将使用循环来确定您何时到达最左边的节点。在您的递归解决方案中,您将继续调用 min() 方法,直到找到最小的解决方案。然后,为了确定哪个更好,计算出每个解决方案需要多少步。
  • 你编写过 BST 类吗?
  • @RicardoCacheira 是的,兄弟。
  • @RicardoCacheira ricardo,用我尝试做的编辑,你能检查一下解决方案吗?并给出您的反馈?

标签: java recursion iterator


【解决方案1】:

我认为如果我给你的解决方案你不会学,我会给你一个链接来阅读更多关于二叉搜索树的信息:http://en.wikipedia.org/wiki/Binary_search_tree

在那条评论之后,我的方式:

public T min() {
    return recMin(root).getInfo();
}

public BSTnode<T> recMin(BSTnode<T> tree) {
    if (tree == null) {
        throw new NoSuchElementException();
    }
    if (tree.left == null) {
        return tree;
    }
    return recMin(tree.left);
}

public T IterationMin(BSTnode<T> tree) {
    if (tree == null) {
        throw new NoSuchElementException();
    }

    while (tree.left != null) {
        tree = tree.left;
    }
    return tree.getInfo();
}

【讨论】:

    【解决方案2】:

    关于迭代还是递归更好。这真的取决于。一般来说,递归解决方案往往更容易理解,但速度较慢,因为它们消耗的堆栈空间与递归深度成正比。但是,在这种情况下,您可以提出一个尾递归解决方案,该解决方案应该易于理解并且与迭代解决方案一样高效。

    public BSTNode<T> findMin(BSTNode<T> node) {
        if (node.left == null)     // if there is no left, we are done
            return node;
        return findMin(node.left); // recursively search on the left-child
    }
    

    首先在头节点上调用此方法。

    【讨论】:

    • 在这种情况下,我会说递归和迭代大致相同,因为它们都需要进行相同数量的比较才能达到最小值(尽管我同意你说他们通常比较慢)。
    • 猪肉,什么都行?
    • @user2272227:这将递归地寻找最小节点(即最小值)。如果您的二叉树工作并且最小值存储在最左边的节点中,则将返回它。您仍然需要一个迭代解决方案。
    • @AndrewMartin 检查主帖中的代码,刚刚编辑和添加。
    • @user2272227:出于好奇,你为什么不能测试?你需要的不仅仅是你发布的代码来测试,比如一个比较器方法来确定两个节点是否相等。
    【解决方案3】:

    二叉搜索树总是在左边有一个较低的值,对吗?所以,你应该尽可能向左走。如果你不能,那么你已经达到了最低值。

    【讨论】:

    • +1:但是,只是为了挑剔,二叉搜索树总是在左边有较低的值 - 而不是二叉树。
    • @AndrewMartin 确切地说,我正在使用二叉搜索树。我不知道该怎么做。
    • @user2272227:Joel 是对的,我只是对搜索树部分吹毛求疵。你的树是有组织的,所以最小值在左边,最大值在右边。所以你想开发一种方法,就像乔尔所说的那样,一直向左看,直到它不能再往前走。
    • @AndrewMartin andrew,用我的两个版本的代码编辑了帖子,你能检查一下并给出你的反馈吗?
    • 对于您在上面发布的递归解决方案,您将BSTNode 转换为T。这将失败,继续并在返回的 BSTNode 上使用您的 getInfo() 方法。从概念上讲,我认为您对两者都有正确的想法。但是只有在正确构建树的情况下才能找到最小节点。我建议编写一个Add 方法来巩固您对 BST 结构的理解。
    猜你喜欢
    • 2014-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多