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;
}
}
deleteTree函数接受二叉树的根,并尝试按顺序删除元素。 但是,在将每个节点设置为null之后,除root之外的原始节点a,b,c,d仍然不为空。它们中包含数据字段,左右子项设置为null.Referenece等于a,b,c,d,null返回false,而root则为true。
如何将原始节点也设置为null?
答案 0 :(得分:4)
如果你在一张纸上写下你的家庭住址,然后烧掉那张纸,它会破坏整个世界上写有你地址的每张纸吗?燃烧那张纸毁了你的房子吗?
r.left
包含对象的地址。您已将地址设置为null,从而将其销毁。这对任何其他地址或对象本身没有任何影响。
答案 1 :(得分:0)
您的代码存在的问题是存储在节点字段中的引用与方法Main的调用上下文中的引用无关。
root = null;
引用Main方法范围中的变量。
and deleteTree(ref root.left);
引用类实例中的字段。