我目前有二进制搜索树的插入方法的递归版本。我现在试图获得相同的结果,但我希望它是一个迭代版本。我觉得我非常接近,如果有人可以给我一些建议,我还需要做些什么才能让这个工作起来,因为我在这一点上很难过。
递归:
public void insert(E item)
{
root = insert(root, item, 0);
}
private BNode insert(BNode ptr, E item, int d)
{
if (ptr == null) {
++Size;
return new BNode(item, null, null, d);
}
int diff = item.compareTo(ptr.data);
if (diff < 0)
ptr.left = insert(ptr.left, item, d+1);
else if (diff > 0)
ptr.right = insert(ptr.right, item, d+1);
else
; // duplicates;
return ptr;
}
My Current for Iterative version:
public void insert(E item)
{
BNode ptr = root;
int d = 0; // set the initial depth
if(ptr == null) {
++Size;
root = new BNode(item, null, null, d);
}
while(ptr != null) {
int diff = item.compareTo(ptr.data);
if(diff < 0)
ptr.left = new BNode(item, null, null, d+1); // *EDIT
else if (diff > 0){
ptr.right = new BNode(item, null, null, d+1); //*EDIT
}
else
break; // no duplicates
}
++Size;
}
}
答案 0 :(得分:0)
@CyberneticTwerkGuruOrc当我运行测试时,我的版本将无法编译 在上面。这些项目未插入树中。我迷失了 问题是什么?
你发布了矛盾的观点。如果它无法编译,那么你是如何运行它的?我假设你可以编译它。
除了根节点之外,您实际上从未添加过新节点。你想改变你的while循环。一旦找到空点,就应该将新节点放在那里。然后打破循环。
while(ptr != null) {
int diff = item.compareTo(ptr.data);
if(diff < 0)
ptr = ptr.left;
else{
ptr = ptr.right;
}
//update this code here
if(ptr == null){
ptr = new BNode(item, null, null, d);
++Size;
break;
}
}