在C#.net中删除二叉树

时间:2014-11-17 18:23:45

标签: c# .net data-structures

    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?

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:0)

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