二元搜索树的非递归底层方法

时间:2014-10-03 00:02:47

标签: java binary-search-tree

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

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

1 个答案:

答案 0 :(得分: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()) <= 0
      • root.getLeft() != null
        • 继续
      • root.compareTo(lowestRightNode) < 0 ? root : lowestRightNode
        • 终端
    • 否则
      • root.getRight() != null
        • 存储临时值并继续
      • return lowestRightNode
        • 终端

密切关注您的延续条件,以及您必须做的其他工作,以跟踪您目前所见的最低节点(仅限于右侧,即) 。

*:当然,有些递归操作比其他操作更难以转换痛苦