从递归方法编写迭代方法

时间:2015-11-26 06:10:33

标签: recursion binary-search-tree

我正在进行二叉搜索树作业,并被要求将递归方法转换为迭代方法。这是递归方法,下面是我的迭代方法。此方法应返回包含第k个键的节点。我的方法一直给我一个NullPointerException,我不知道为什么。谢谢。

提供代码:

public Key select(int k) {
    Node node = select(root, k);
    if (node==null) {
        return null;
    } else {
        return node.key;
    }
}

// Return Node containing kth key (zero based)
private Node select(Node node, int k) { 
    if (node == null) return null;

    int t = size(node.left);
    if (t > k)
        return select(node.left, k);
    else if (t < k)
        return select(node.right, k - t - 1);
    else
        return node;
}   

我的代码:

public Key selectI(int k) {
    return selectI(root, k);
}

private Key selectI(Node node, int k) {
    Node curr = node;
    while (curr != null) {
          int t = size(node.left);
          if (t > k) {
               curr = node.left;
          } else if (t < k) {
               curr = node.right;
               k = (k - (t - 1));

          } else
               return curr.key;
    }
    return null;
}

1 个答案:

答案 0 :(得分:1)

问题似乎是你没有更新k的值。这通常是递归完成的,但如果要创建迭代函数,则必须以数学方式完成。当您向左传递(t> k)时,您将继续搜索大小为k的节点。当您向右传递(t

还要确保您不断更新正在查看的当前节点的大小。你不想只看树的大小,这会破坏你的t和k值之间的数学关系,这将导致程序运行,直到没有更多的节点可供查看!