2012-02-17 152 views
2

我在做这个任务:http://www.cs.colostate.edu/~anderson/ct310/index.html/doku.php?id=assignments:assignment_2二叉树在Javascript

我建立在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方法上得到一个堆栈溢出。我的教授说要在if语句中使用this.Left(),因为当你递归时它会在未定义时失败。

任何想法有什么不对?

+0

您的意思是:如果(this.left()) - 没有this.tree()?在构造函数中没有this.tree :) – mfeineis 2012-02-17 15:37:31

+0

对于我来说,称这个类为“tree”而不是“node”是很奇怪的,因为tree是较大结构的名称。我会调用由两个指针构成的二叉树结构。 BA-屁股-CH。 – nwellcome 2012-02-17 15:49:38

回答

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他们()