我正在进行二叉搜索树作业,并被要求将递归方法转换为迭代方法。这是递归方法,下面是我的迭代方法。此方法应返回包含第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;
}
答案 0 :(得分:1)
问题似乎是你没有更新k的值。这通常是递归完成的,但如果要创建迭代函数,则必须以数学方式完成。当您向左传递(t> k)时,您将继续搜索大小为k的节点。当您向右传递(t 还要确保您不断更新正在查看的当前节点的大小。你不想只看树的大小,这会破坏你的t和k值之间的数学关系,这将导致程序运行,直到没有更多的节点可供查看!