下面是我为deleteItem位于叶节点时编写的代码。即使我将找到的叶节点等同于" null"然后当我打印顺序遍历顺序如果树,该元素没有被删除并出现在屏幕上。我错过了什么?
public void deleteNode(T deleteItem)
{
TreeNode<T> node = root;
if(root == null)
{
System.out.print("Binary Tree does not exist");
System.exit(0);
}
while((node.data != deleteItem) && (node.leftNode != null || node.rightNode != null))
{
if(deleteItem.compareTo(node.data)<0)
node = node.leftNode;
else
node = node.rightNode;
}
//System.out.printf("deleting item is: %s\n", node.data);
if(node.data != deleteItem)
{
System.out.println("\ndeleteItem not found in the tree");
System.exit(0);
}
else
{
if(node.leftNode == null && node.rightNode == null)
{
node = null;
}
}
}
答案 0 :(得分:1)
Java是"Pass-by-value",
所以TreeNode<T> tmp = root
在这里意味着为tmp
分配root
的引用,这意味着您只需要对同一个实例有两个不同的引用。
根据这一点,当您说node = null
时,您将本地引用设置为null
,这意味着节点的父级仍然引用它。
因此,要从树中删除叶节点,您需要跟踪其父节点,然后删除对节点的引用(删除树中的引用而不是本地副本),这将是这样的:
public void deleteNode(T deleteItem) {
TreeNode<T> node = root;
TreeNode<T> parent = null; // parent of the deleted node.
if(root == null) {
System.out.print("Binary Tree does not exist");
System.exit(0);
}
while((node.data != deleteItem) &&
(node.leftNode != null || node.rightNode != null)) {
parent = node; // keep track of the parent of the deleted node
if(deleteItem.compareTo(node.data) < 0)
node = node.leftNode;
else
node = node.rightNode;
}
if(node.data != deleteItem) {
System.out.println("\ndeleteItem not found in the tree");
System.exit(0);
}
else {
if(parent.leftNode == node)
parent.leftNode = null;
else
parent.rightNode = null;
}
}