【发布时间】:2015-01-14 18:08:14
【问题描述】:
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。他们有数据字段,其中左右子项设置为 null。对于 a、b、c、d 的引用等于 null 返回 false,对于 root 返回 true。
如何将原始节点也设置为空?
【问题讨论】:
-
您没有通过引用传递
a或b或c或d,因此它们仍然引用原始节点。但这整个练习是错误的。 C# 是一种 GC 语言。只需执行r = null即可完成。 -
不是r.left==a吗?我的意思是它们都引用同一个对象,对吗?我通过 r.left 通过 ref
-
您通过引用传递了
r.left,但没有传递a。想一想:int a = 42; int b = a; SomeFunction(ref b);如果SomeFunction修改了b,是不是也要修改a?
标签: c# .net data-structures