【问题标题】:Java BST searching for max value, most efficientlyJava BST搜索最大值,最有效
【发布时间】:2013-12-12 22:26:21
【问题描述】:

长期读者第一次发帖(主要是因为 99% 的问题已经在这里得到解答!!!)

我已经浏览了大约一个小时,但无法找到解决此问题的方法。给定一个预先排序的平衡二叉搜索树,我的任务是使以下方法更有效地找到树中的最大值:

private int max(IntTreeNode root) {
    if (root.left == null && root.right == null)
        return root.data;
    else {
        int maxValue = root.data;
        if (root.left != null)
            maxValue=Math.max(maxValue,max(root.left));
        if (root.right != null)
            maxValue = Math.max(maxValue,max(root.right));
        return maxValue;

这是我的两个想法(可能其中一个是错误的,这就是问题所在):

1) 虽然它已排序和平衡,但它的大小可能会有所不同,因此我必须检查每一片叶子,因为该方法的唯一参数是根,我在那里看不到任何快捷方式。

2) 相同的原因,单个参数,意味着我必须使用行 maxValue=Math.max(maxValue,max(root.left));在每个递归调用中,以便在 maxValue 上保持一个运行数字。所以我看不出在哪里可以跳过那些无用的计算。

被问到的问题是,考虑到排序后的平衡 BST 信息,您如何使该方法更有效,其他信息正是我所在的位置。谢谢

编辑 我想我担心的是 11 元素树

         1
       /   \
      2      3
     / \    /  \
    4  5    6    7
   / \/ \  /  \ / \  (making a tree got real hard)
  8  9 10 11        (this row is a little messed up but demonstrates the point)

如果你只选择正确的,你最终会在 7 点,因此是错误的。除非我对排序 BST 的含义感到困惑,否则 BST 是否总是必须在底行填满?

【问题讨论】:

  • 由于树是排序的,最大值应该在最右边,所以不需要检查root.left。
  • 你所描绘的只是一棵二叉树。二叉搜索树(BST)是二叉树的一种特殊情况。 en.wikipedia.org/wiki/Binary_search_tree
  • 好吧,这至少是有道理的,ty Ajai!这种树就是我们得到的程序输出的内容,任务内容如下:“重写 min 和 max 方法,以便它们与二叉搜索树一起使用。将这些方法添加到我们在课堂时间处理的代码中。这些方法应利用树已排序的事实,除非必要,否则不应检查节点。”所以我不明白为什么分配与提供的源代码无关,哈哈,但是鉴于您的链接和信息,正确的唯一树选项非常有意义,适合所有人

标签: java recursion binary-search-tree


【解决方案1】:

在 BST 中,最右边的元素是最大值。

这是伪代码。

int getMax(Node root) { //check if root is null
   if(root.right == null) {
       return root.data 
   } else {
       return getMax(root.right)
   }
}

对于平衡树,顺序为O(log n)

【讨论】:

    【解决方案2】:

    对于 LHS,它总是小于根目录,因此无需搜索即可使用:

    private int max(IntTreeNode root) {
         if ( root.right == null) // no need to search in LHS
           return root.data;
         else {
            int maxValue = root.data;
            maxValue = Math.max(maxValue,max(root.right));
         }
         return maxValue;
    

    如果这不是你想要的,再问我你想要什么是这个方法的预期输出,我会尽力帮助你:)

    【讨论】:

      猜你喜欢
      • 2013-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-03
      • 1970-01-01
      • 1970-01-01
      • 2015-09-20
      • 1970-01-01
      相关资源
      最近更新 更多