将对象的引用设置为null似乎不起作用

时间:2015-10-07 08:04:16

标签: c# .net binary-tree

我正在尝试使用c#从二叉树中删除节点。此示例仅在节点没有子节点时才有效。我理解删除如何与孩子们一起工作,但是我对这个问题感到困惑,这似乎是因为我对c#缺乏了解:

public class Tree
{
internal class Node
{
    public int Val { get; set; }
    public Node Left { get; set; }
    public Node Right { get; set; }

    public Node(int val)
    {
        Val = val;
    }
}

private Node root;
public void Delete(int val)
{
    Node current = this.root;
    Node parent = null;

    while (true) {
        if (val < current.Val) {
            parent = current;
            current = current.Left;
        }


        else if (val > current.Val) {
            parent = current;
            current = current.Right;
        }

        else if (val == current.Val) {
            current = null;
            return;
        }
    }

}

}

我的问题是在我设置current = null的行中。我打算使用它的方法是使用current = null来删除当前节点。但它不起作用。如果我从父节点引用当前节点:

parent.Right = null;

节点被正确删除,但显然很痛苦,因为我需要检查当前节点是否是节点的右子节点。我错过了什么?提前谢谢!

1 个答案:

答案 0 :(得分:0)

你不能这样做。

current变量是与parent.Leftparent.Right变量分开的变量。

执行此操作时:

current = parent.Left;

您正在复制变量的,而不是将一个变量链接到另一个变量。你可以把它比作postit notes。在一个便条纸上你有一个地址,然后你执行上面的声明并将地址复制到另一个便条纸上。之后更改副本不会以任何方式或形状改变原始音符。

所以是的,您需要跟踪来自哪个子引用变量current