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

本文关键字:null 不起作用 设置 对象 引用 | 更新日期: 2023-09-27 18:16:19

我正在尝试使用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;

节点被正确删除,但这显然很麻烦,因为我需要检查当前节点是该节点的右子节点还是左子节点。我错过了什么?提前感谢!

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

你不能这么做。

current变量是独立于parent.Leftparent.Right变量的变量。

当你这样做的时候:

current = parent.Left;

你复制了变量的,你没有将一个变量链接到另一个。你可以把它比作便利贴。在一张便条上你有一个地址,然后你执行上述声明,并复制地址到另一张便条上。之后更改副本不会以任何方式或形状改变原始笔记。

所以,是的,您需要跟踪您从哪个子引用变量获得current