【问题标题】:Homework: Return the least element in the set greater than given element BST作业:返回集合中大于给定元素 BST 的最小元素
【发布时间】:2016-03-29 09:13:02
【问题描述】:

所以我被困了好几个小时试图找出这个问题。

给定一个随机生成的 BST 并使用方法头: public E higher(E elt)

其中elt 是树范围内随机生成的值,我需要找到集合中大于elt 的最小元素。

节点包含左链接和右链接,但没有父链接。

链接图像中的树以根为最左边的节点读取 BST.

所以如果elt是27,那么我想返回包含28的节点。

我需要在 O(logn) 时间内运行它,而我尝试过的一切都没有奏效。 我不是在找人帮我做作业,但我现在不知道该怎么做。

如果需要,我可以提供更多细节和源代码。

编辑:我会把它放在这里,尽管它非常不合适。我觉得如果我可以递归地执行此操作会更容易,但我想不出办法。

Node n = root;
    //need to get this into a loop somehow and break out when I've found
    //the right value
    int c = myCompare(elt, ((E) n.data));
    if (c < 0) {
        n = n.left;
        //now I need to compare this against any children
    } else if (c > 0) {
        n = n.right;
        //now I need to compare this against any children
    }
    return ((E)n.data);

【问题讨论】:

  • 如果您想了解更多关于可以做到这一点的方法,这也称为ceiling 函数。还有floor,它得到小于或等于给定元素的最高元素。

标签: java binary-search-tree


【解决方案1】:

这取决于 BST 的基本属性:左孩子小于父母,右孩子大于父母。如果您查看示例 BST,您会很快注意到一些属性,并且您会明白为什么以下算法会起作用。
如果当前节点小于给定值,则向右移动,否则向左移动。如果你到达一个向左移动的点会给你一个太低的值(或者你碰到一片叶子),那么你找到了正确的节点。或者,在 pythonic 伪代码中:

while (true):
   if (node.value <= elt):
      node = node.right
   else:
      if (node.left.value < elt):
         return node.value
      else:
         node = node.left

伪代码显然需要检查错误,如果一个节点是叶子等,但这个通用算法会在所需的时间复杂度内为您提供预期的输出(假设 BST 是平衡的)。

【讨论】:

    【解决方案2】:

    一种可能的方法是找到指定的节点并从那里获取下一个最小节点(如果允许使用辅助方法)。

    如果我们说根节点是 'n' 并且我们知道所需的值在 BST 内,那么您可以遍历它以找到包含给定值的节点,如下所示:

        public Node search(Node n, E obj)
        {
          if(obj.compareTo(n.getValue()) > 0)
          {
            return search(n.getRight(), obj);
          }
          else if(obj.compareTo(n.getValue()) < 0)
          {
            return search(n.getLeft(), obj);
          }
          else
          {
            return n;
          }
        }
    

    如果目标是从二叉搜索树中检索最小值,则可以使用像这样的简单递归方法:

       public Node getLeast(node n)
       {
         if(n.getLeft()==null)
         {
           return n;
         }
         return getLeast(n.getLeft());
       }
    

    利用二叉搜索树的原理,我们知道大于给定节点的最小值就是给定节点右孩子之后的最小节点。所以,我们可以直接用这个方法来获取想要的值:

        getLeast(search(n,elt).getRight());
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多