在C#.net中删除二叉树

在C#.net中删除二叉树,c#,.net,data-structures,C#,.net,Data Structures,deleteTree函数取二叉树的根,并尝试按后序删除元素。 然而,在将每个节点设置为null之后,除了root之外的原始节点a、b、c、d仍然不是null。其中的数据字段的左、右子项设置为null。对于a、b、c、d,referenceequals和null返回false,对于root返回true 如何将原始节点也设置为空?如果你在一张纸上写下你的家庭地址,然后烧掉那张纸,它会毁掉世界上所有写有你地址的纸吗?烧掉那张纸会毁了你的房子吗 r.left包含对象的地址。您已将该地址设置为空,从而销毁

deleteTree函数取二叉树的根,并尝试按后序删除元素。 然而,在将每个节点设置为null之后,除了root之外的原始节点a、b、c、d仍然不是null。其中的数据字段的左、右子项设置为null。对于a、b、c、d,referenceequals和null返回false,对于root返回true


如何将原始节点也设置为空?

如果你在一张纸上写下你的家庭地址,然后烧掉那张纸,它会毁掉世界上所有写有你地址的纸吗?烧掉那张纸会毁了你的房子吗


r.left
包含对象的地址。您已将该地址设置为空,从而销毁了该地址。这不会影响任何其他地址或对象本身。

如果你在一张纸上写下你的家庭地址,然后烧掉那张纸,它会毁掉全世界所有写有你地址的纸吗?烧掉那张纸会毁了你的房子吗


r.left
包含对象的地址。您已将该地址设置为空,从而销毁了该地址。这不会影响任何其他地址或对象本身。

代码的问题是,存储在节点字段中的引用与方法Main的调用上下文中的引用无关。
root=null引用主方法范围中的变量。

和deleteTree(ref root.left)引用类实例中的字段。

代码的问题在于,存储在节点字段中的引用与调用Main方法上下文中的引用无关。
root=null引用主方法范围中的变量。

和deleteTree(ref root.left)
引用类实例中的字段。

您没有通过引用传递
a
b
c
d
,因此它们仍然引用原始节点。但这整个过程都被误导了。C#是一种GC语言。只要执行
r=null
就完成了。r.left==a不是吗?我的意思是它们都指向同一个对象right?我通过了r.left by ref你通过了
r.left
by ref,但不是
a
。想想看:
inta=42;int b=a;SomeFunction(参考文献b)
如果
SomeFunction
修改了
b
,它是否也应该修改
a
?您没有通过引用传递
a
b
c
d
,因此它们仍然引用原始节点。但这整个过程都被误导了。C#是一种GC语言。只要执行
r=null
就完成了。r.left==a不是吗?我的意思是它们都指向同一个对象right?我通过了r.left by ref你通过了
r.left
by ref,但不是
a
。想想看:
inta=42;int b=a;SomeFunction(参考文献b)
如果
SomeFunction
修改了
b
,它是否也应该修改
a
?+1,以便更好地比较对纸张的引用。然而,使用对象的实例更像是燃烧房子本身,为了更好地比较对纸片的引用,imho.+1。然而,处理对象的实例更像是燃烧房子本身。
    public class Program
        {
            public static void Main()
            {
                BinaryTree bt = new BinaryTree();

                Node r = new Node(1);
                Node a = new Node(2);
                Node b = new Node(3);
                Node c = new Node(4);
                Node d = new Node(5);

                r.left = a;
                r.right = b;
                a.left = c;
                a.right = d;

                bt.deleteTree(ref r);

                Console.WriteLine("Is r deleted:" + ReferenceEquals(r, null));
                Console.WriteLine("Is a deleted:" + ReferenceEquals(a, null));
                Console.WriteLine("Is b deleted:" + ReferenceEquals(b, null));
                Console.WriteLine("Is c deleted:" + ReferenceEquals(c, null));
                Console.WriteLine("Is d deleted:" + ReferenceEquals(d, null));
    }
    }

public class Node
    {
        public int data;
        public Node left=null;
        public Node right=null;

        public Node(int x)
        {
            data = x;
        }
    }

public class BinaryTree
    {  

        public void deleteTree(ref Node root)
        {
            if (root == null) return;

            deleteTree(ref root.left);
            deleteTree(ref root.right);
            Console.WriteLine(root.data);
            root = null;
        }
}