2012-02-17 151 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他們()