2012-02-17 5 views
2

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

Я строй бинарного дерева в JavaScript. В основном это реляционное дерево, у нас есть этот древовидный класс, который принимает 3 аргумента: данные, левый ребенок, правый ребенок. Left & правый ребенок - это только новые объекты дерева, хранящиеся в 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, потому что, когда вы его перезаписываете, он будет терпеть неудачу, если он не определен.

Любые идеи, что не так?

+0

вы имели в виду: если (this.left()) - без this.tree()? В конструкторе нет this.tree :) – mfeineis

+0

Мне странно назвать этот класс «tree» вместо «node», поскольку дерево - это название более крупной структуры. Я бы назвал структуру, состоящую из деревьев с двумя указателями двоичного леса. ба-бам-ч. – nwellcome

ответ

3

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

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

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

Кроме того, для небольшой оптимизации, рассмотреть что-то вроде:

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

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

1

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

Если узел не имеет детей, чем не называют ToString на них()