Двоичное дерево в Javascript - PullRequest
       16

Двоичное дерево в Javascript

2 голосов
/ 17 февраля 2012

Я работаю над этим заданием: http://www.cs.colostate.edu/~anderson/ct310/index.html/doku.php?id=assignments:assignment_2

Я строю двоичное дерево в Javascript. По сути это реляционное дерево, у нас есть этот класс дерева, который принимает 3 аргумента: данные, левый потомок, правый потомок. Левый и правый дочерние элементы - это просто новые объекты дерева, хранящиеся в var.

Вот класс дерева:

function Tree( data, left, right ) 
{   
    // pravite data 
    var data = data; 
    var leftChild = left; 
    var rightChild = right; 

    // public functions 
    this.getData = function()
    {
        return data;
    }

    this.left = function()
    {
        return leftChild; 
    }

    this.right = function()
    {
        return rightChild; 
    }

}

Вот метод toString ()

Tree.prototype.toString = function(indent) 
{
  var spaces = '';
  if (!indent)
  {
    indent = 0;
  }
  else{
    spaces = spaces*indent; 
  }
    // if the left tree isn't void
    if(this.tree().left())
    {
        this.tree().left().toString(indent+5); 
    }
    if(this.tree().right())
    {
        this.tree.right().toString(indent+5); 
    }
    print(spaces + this.data);
}

Вот данные, которые мне передают. Мы используем Rhino в командной строке для тестирования.

var abc = new Tree('a', new Tree('b'), new Tree('c'));
abc.toString()

Я получаю стек через поток в методе toString. Мой профессор говорит использовать this.Left () в операторе if, потому что, когда вы выполняете рекурсивный анализ, он потерпит неудачу, когда он не определен

Есть идеи, что не так?

Ответы [ 2 ]

3 голосов
/ 17 февраля 2012

Ну, в вашей последней ссылке на правую ветку отсутствуют некоторые скобки ...

this.tree.right().toString(indent+5) // <-- right here

Этого, я не вижу, this.tree() нигде не определен. Я думаю, что это должно быть this.left() и this.right() во всех этих местах.

Также для небольшой оптимизации рассмотрим что-то вроде:

var l = this.left();
if( l) l.toString(indent+5);

Это позволяет избежать дополнительного вызова функции.

1 голос
/ 18 февраля 2012

Ваша рекурсивная функция не имеет базового регистра.Это будет продолжаться вечно.

Если у вашего узла нет дочерних элементов, не вызывайте ToString для них ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...