如何删除二叉树的叶子?
我正试图把所有的叶子都去掉。我知道叶子没有孩子,这就是我到目前为止所拥有的。
public void removeLeaves(BinaryTree n){
if (n.left == null && n.right == null){
n = null;
}
if (n.left != null)
removeLeaves(n.left);
if (n.right != null)
removeLeaves(n.right);
}
I'm trying to remove all of the leaves. I know that leaves have no children, this is what I have so far.
public void removeLeaves(BinaryTree n){
if (n.left == null && n.right == null){
n = null;
}
if (n.left != null)
removeLeaves(n.left);
if (n.right != null)
removeLeaves(n.right);
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(8)
n = null;
对您没有帮助,因为n
只是函数的局部变量。相反,您需要在父级上设置n.left = null;
或n.right = null;
。我不会给你一个完整的解决方案,因为这听起来很像家庭作业,但你可以,例如,向你的函数添加一个返回值,以指示所讨论的节点是否是叶子,并在父级(在调用
removeLeaves
之后)。n = null;
won't help you, sincen
is just a local variable of your function. Instead, you'd need to setn.left = null;
orn.right = null;
on the parent.I won't give you a complete solution, since this smells a lot like homework, but you could, for example, add a return value to your function to indicate whether the node in question is a leaf or not and take appropriate actions in the parent (after the call to
removeLeaves
).如果你像这样分解它就会容易得多:
isLeaf
、removeLeftChild
和removeRightChild
应该很容易实现。It's much easier if you break this down like this:
isLeaf
,removeLeftChild
andremoveRightChild
should be trivial to implement.而不是 n = null,它应该是:
Instead of n = null, it should be:
由于 Java 通过值传递引用,
n = null;
根本不起作用。这条线 n 原本指向叶子,现在指向任何东西。所以你实际上并没有从父级中删除它,你只是重新路由一个虚拟的本地引用。对于解决方案,请按照马修的建议进行操作。Since Java passes references by values
n = null;
simply does not work. With this line n was pointing to the leaf and now points to nothing. So you aren't actually removing it from the parent, you are just rerouting a dummy local reference. For the solution do what Matthew suggested.这是一个简单的java方法,用于从二叉树中删除叶节点
Here's a simple java method to delete leaf nodes from binary tree
简单的方法与recussion。
Easy method with recusrion .
这应该有效-
This should work-