为什么我的_root在这里停留?

时间:2016-06-05 01:43:15

标签: c# .net algorithm binary-search-tree

我已经完成了

的代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace GenericBinaryTree
{
    class Program
    {
        static void Main(string[] args)
        {
            BinaryTree<int> B = new BinaryTree<int>();
            Random rnd = new Random();
            for(int i = 0; i <= 100; ++i)
            {
                B.Add(rnd.Next(Int32.MinValue, Int32.MaxValue));
            }
            B.Print();
        }
    }

    class BinaryTree<T> where T : IComparable<T>
    {
        public class Node
        {
            public T val { get; set; }
            public Node left { get; set; }
            public Node right { get; set; }
        }

        private Node _root = null;

        public void Add ( T newval )
        {
            Add(newval, _root);
        }

        private void Add ( T newval, Node root )
        {
            if(root != null)
            {
                if(newval.CompareTo(root.val) < 0)
                    Add(newval, root.left);
                else if(newval.CompareTo(root.val) > 0)
                    Add(newval, root.right);
            }
            else
            {
                root = new Node() { val = newval, left = null, right = null };
            }
        }

        public void Print ( )
        {
            if(_root != null)
                PrintValAndDescendants(_root);     
        }

        private void PrintValAndDescendants ( Node  n )
        {
            Console.WriteLine(n);
            if(n.right != null) PrintValAndDescendants(n.right);
            if(n.left != null) PrintValAndDescendants(n.left);
        }
    }
}

我无法弄清楚为什么我的_root

时没有设置
Add(newval, _root);

最初被调用。块

else
{
   root = new Node() { val = newval, left = null, right = null };
}

应该使它成为非null,但事实并非如此......除非有我遗漏的东西。

1 个答案:

答案 0 :(得分:4)

rootAdd函数范围内的本地变量。最初,root_root指向同一个对象,但通过为其指定new Node,您只需更改指向root的对象。它不会改变_root指向的内容。

您需要直接设置_root,或者root ref参数。