我已经完成了
的代码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
,但事实并非如此......除非有我遗漏的东西。
答案 0 :(得分:4)
root
是Add
函数范围内的本地变量。最初,root
和_root
指向同一个对象,但通过为其指定new Node
,您只需更改指向root
的对象。它不会改变_root
指向的内容。
您需要直接设置_root
,或者root
ref
参数。