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