【问题标题】:Non recursive floor method for Binary search tree二叉搜索树的非递归地板法
【发布时间】:2014-10-03 00:02:46
【问题描述】:

我一直试图让它工作,但虽然它适用于大多数输入,但有时它会给出错误的输出。我花了一些时间调试代码,似乎问题是当我得到一个小于根但大于根下的左节点的节点时。

如果右子树中没有节点是该键的楼层节点,我如何遍历右子树并仍然返回正确的键?

【问题讨论】:

  • 我不明白这个算法应该做什么?
  • 它应该是 BST 上 floor() 操作的非递归实现。
  • 所以你想得到key最大的节点
  • 没错。这就是我需要的。

标签: java binary-search-tree


【解决方案1】:

回想一下,如果您以递归方式执行任何操作,则可以将其*转换为迭代。

让我们考虑使用格式良好的 BST,它应该是小于或等于树中键的最小元素。我们所要做的就是遍历树来获取它。

让我们递归地实现它,这样我们就可以梳理出迭代和递归之间的一些重要推论。

// Assuming non-null root node with method declaration
private Node floor(Node root, Key key, Node lowestNode) {
    if(key.compareTo(root.getKey()) <= 0) {
        if(root.getLeft() != null) {
            return floor(root.getLeft(), key, lowestNode);
        } else {
            return root.compareTo(lowestNode) < 0 ? root : lowestNode;
        }
     } else {
        if(root.getRight() != null) {
           lowestRightNode.add(root);
           return floor(root.getRight(), key, lowestNode);
        } else {
           return lowestNode;
     }
}

让我们来看看成功的条件。

  • 如果我们比较一个节点小于或等于我们的键值:
    • 如果我们有一个左孩子,就会有更小的孩子。遍历树的左半部分。
    • 否则,我们就在地板上 - 这意味着我们在值小于或等于我们的键的节点上。退货。
  • 否则(我们的节点的值大于我们的键):
    • 如果我们有一个合适的孩子,那么我们的工作可能还没有完成(有些事情更小)。我们想保留它,因为我们可以从树上走下来,所以我们先把它存储起来,然后沿着树的右半边向下遍历。
    • 否则,我们就会从树上掉下来。返回我们记录的最小元素。

示例可能如下所示:

        9
       / \
      3  14
     / \  
    1  2

使用 12 键:

  • 与 9 相比。我们更大。将 9 存储在我们最低的节点变量中,向右递归。
  • 与 14 相比。我们更小,但我们没有左孩子。我们将值 14 与 9 进行比较,并且 9 更小,因此我们返回具有 9 的节点。

如果我们想将其转换为迭代,请考虑您的起点、条件检查和增量步骤。

  • 起点:非空节点
  • 条件检查:
    • key.compareTo(root.getKey()) &lt;= 0
      • root.getLeft() != null
        • 继续
      • root.compareTo(lowestRightNode) &lt; 0 ? root : lowestRightNode
        • 终端
    • 其他
      • root.getRight() != null
        • 存储温度值并继续
      • return lowestRightNode
        • 终端

密切注意您的延续条件,以及您还需要做哪些其他工作来跟踪您迄今为止看到的最低节点(即仅适用于右侧)。

*:当然,某些递归操作比其他操作更痛苦。

【讨论】:

  • 感谢您的精彩解释。我想通了,但这有助于我更好地理解这一点。
猜你喜欢
  • 2014-01-02
  • 1970-01-01
  • 2013-04-21
  • 2012-01-26
  • 1970-01-01
  • 2021-07-03
  • 2019-04-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多