作业:返回集合中的最小元素大于给定元素BST

时间:2016-03-28 23:08:23

标签: java binary-search-tree

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

给定一个随机生成的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);

2 个答案:

答案 0 :(得分:0)

这取决于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)。

答案 1 :(得分:0)

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

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

PacketHandler

如果目标是从二叉搜索树中检索最小值,那么这样的简单递归方法就可以工作:

    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());
   }