我正在尝试删除BST中的最小元素。可能有2种情况:
案例1:没有合适的孩子 在这种情况下,请将当前节点立即设置为空。
node=delete(node);
第二种情况:合适的孩子在场。 在这种情况下,将右子节点的内容复制到当前节点,然后删除右子节点。
if(node.right!=null)
{
node.data=node.right.data;
node.right=null;
}
我的疑问是,为什么第二种情况有效而第一种情况无效。我的意思是,如果“ node”是一个引用变量,因此将其为null不会使它在实际树中为null,那么为什么node.right可以正常工作吗? 我的完整功能代码:
public static int del_min(Node node)
{
if(node.left==null)
{
minimum=node.data;
if(node.right!=null) //WORKING
{
node.data=node.right.data;
node.right=null;
}
else //NOT WORKING
{
node=null;
}
}
else
{
minimum=del_min(node.left);
}
return minimum;
}
请帮助我。
答案 0 :(得分:1)
之所以不起作用,是因为node.right
存储在内存中,而node
是指向内存中位置的临时指针。
这意味着更新node.right
时,您实际上将在永久存储器中查找存储的指针,然后对其进行更改。当您更新节点时,它将仅在堆栈框架中对其进行更新,并且在函数完成执行后,该引用将被删除。
以下是有关按引用传递和一般引用类型的更多信息: https://web.archive.org/web/20180706164632/http://www.yoda.arachsys.com/csharp/parameters.html