我的方法看起来像
static Node _root = null;
static void AddToTree(int val)
{
AddToTree(val, ref _root);
}
static void AddToTree(int val, ref Node root)
{
if(root == null)
root = new Node() { Val = val };
Node left = root.Left, right = root.Right;
if(root.Val > val)
AddToTree(val, ref left);
else if(root.Val < val)
AddToTree(val, ref right);
}
我怎么看它失败的是我跑
int[] vals = { 2, 1, 5, 3, 8 };
foreach(int i in vals)
AddToTree(i);
Print();
使用
static void Print()
{
if(_root == null)
return;
LinkedList<int> vals = new LinkedList<int>();
Queue<Node> q = new Queue<Node>();
q.Enqueue(_root);
while(q.Count > 0)
{
Node front = q.Dequeue();
vals.AddLast(front.Val);
if(front.Right != null)
q.Enqueue(front.Right);
if(front.Left != null)
q.Enqueue(front.Left);
}
Console.WriteLine(string.Join(",", vals));
}
我看到的输出是
2
即。第一个元素添加,没有其他元素。
知道我哪里出错了吗?
答案 0 :(得分:7)
此代码序列不符合您的想法:
Node left = root.Left;
Foo(ref left);
您通过引用传递left
,而不是root.Left
。现在Foo()
重新分配left
时,只有left
会受到影响,而不会root.Left
。
当然你是can't pass properties by reference,所以解决办法就是在root.Left = left
返回后重新分配Foo()
。