2017-02-03 2 views
2

Мой метод (ы) вид (ы) какГде ошибка в моем алгоритме для добавления узла в двоичное дерево?

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)); 
} 

и выход я вижу is

т. Е. Первый элемент добавлен и никаких других элементов.

Любая идея, где я ошибаюсь?

+6

Пробовал ли вы отлаживать свой код, разместив точки останова и пройдя через него? – CodeCaster

ответ

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() вернется.

+0

А ... Я вижу ... – user7127000

Смежные вопросы