public void deleteLeaves(BSTNode<T> p){ //deletes leaves
if(p.left != null){
if(isLeaf(p.left))
p.left = null;
}
else if(p.right != null){
if(isLeaf(p.right))
p.right = null;
}
else{
deleteLeaves(p.right);
deleteLeaves(p.left);
}
}
我似乎无法弄清楚为什么它没有正确删除树叶。它似乎只删除树的最后一片叶子。任何有用的建议都会受到重视。
答案 0 :(得分:2)
你的if语句有点搞砸了;只会使用一个分支。想想如果更近的p.left
和p.right
为空,会发生什么。
如果我理解你的数据结构,我可能会这样写:
// If there is something to the left...
if (p.left != null)
if (isLeaf(p.left))
p.left = null; // delete it if it's a leaf...
else
deleteLeaves(p.left); // else recurse.
// If there's something to the right...
if (p.right != null)
if (isLeaf(p.right))
p.right = null; // delete it if it's a leaf...
else
deleteLeaves(p.right); // else recurse.
答案 1 :(得分:0)
目前,如果p.left != null
,它甚至不会检查p.right
。 else-if
应该是if
。此外,你说两个相邻节点都是空的,然后在它们上面调用deleteLeaves()
,这没有任何意义因为它们是空的。重组您的代码; @aioobe有一个很好的建议
答案 2 :(得分:0)
要正确使用递归,它必须在同一种控制语句中。你不应该检查if中的条件,然后在else if中执行实际的递归。