【问题标题】:Deleting Binary Tree in C# .net在 C# .net 中删除二叉树
【发布时间】: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。

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

【问题讨论】:

  • 您没有通过引用传递abcd,因此它们仍然引用原始节点。但这整个练习是错误的。 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


【解决方案1】:

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

r.left 包含一个对象的地址。您已通过将其设置为 null 来销毁该 地址。这不会影响任何其他地址或对象本身。

【讨论】:

  • +1 可以很好地比较对纸张的引用。然而,处理对象实例更像是烧毁房子本身。
【解决方案2】:

您的代码的问题在于,存储在节点字段中的引用与 Main 方法的调用上下文中的引用无关。 root = null; 引用 Main 方法范围内的变量。 and deleteTree(ref root.left); 引用类实例中的字段。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-01
    • 2016-01-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多