2014-03-26 85 views
1

我試圖做一個JavaScript函數,返回一個完整的二進制文件的HTML到一定數量的位。JavaScript函數打印出一個完整的二叉樹

例如,full_bintree(1)

將給出

/\ 
1 0 

full_bintree(2)的HTML將給出

/\ 
/\ 
    1 0 
/\/\ 
1 01 0 

full_bintree(3)的HTML會給HTML的

  /\ 
     /\ 
     / \ 
    / \ 
    /  \ 
    1   0 
    /\  /\ 
/ \ / \ 
    1  0 1  0 
/\ /\/\ /\ 
1 0 1 01 0 1 0 

等等。

我開始做一個功能,但它看起來很可怕,我一直在意識到需要回頭修復的問題。

function full_bintree(var b) 
{ 
    var retstr = ""; 
    var nr = (2 << b) + (b - 1); // number of rows 
    for (var i = 0, j = nr - 1, k = 0; i < nr; ++i, --j, k += 2) 
    { 
     retstr += "<p>"; 
     // Add leading spaces on line 
     for (var m = 0; m < j; ++m) 
      retstr += " "; 
     // Add backslashes or 

     // Add middle spaces 
     for (var m = 0; m < k; ++m) 
      retstring += " "; 
     // Add forward slashes 
     retstr += "</p>"; 
    } 
} 
+0

刪除從函數定義了'var'關鍵字 - 'full_bintree(B)'' – tymeJV

+0

nr'似乎總是等於'b + 1'(你告訴它繪製很多行加上根)。你也沒有檢查你可能想要做的'b <1'。 'retstr + =「」;'不會在HTML中提供所需的效果。 – adamdc78

回答

2

這是你的功能:

var logtree = function(A){ 
    for(var i = 0; i < A.length; i++) 
     A[i] = A[i].join(""); 
    A = A.join("\n"); 
    if(typeof $ != "undefined") 
     $("#a").html(A); 
    console.log(A); 
    return A; 
}, 
bintree = function(n, A, offset, lvl){ 
    if(typeof offset == "undefined") offset = 0; 
    if(typeof lvl == "undefined") lvl = 0; 
    var width = 3 * Math.pow(2, n) - 1, 
     height = Math.ceil(width/2), 
     mid = Math.floor(width/2), 
     half = Math.ceil(height/2), 
     nsub = Math.pow(2, lvl), 
     lim = offset + half - 1, 
     l = "/", 
     r = "\\"; 
    if(typeof A == "undefined"){ 
     A = []; 
     for(var i = 0; i < height; i++){ 
      a = []; 
      for(var j = 0; j < width; j++) a.push(" "); 
      A[i] = a; 
     } 
    } 
    for(var i = offset, inc = 0; i <= lim; i++){ 
     if(i == lim){ 
      l = 1; 
      r = 0; 
     } 
     var a = 0, j = 0; 
     for(var j = 0; j < nsub; j++){ 
      A[i][mid - inc + a - 1] = l; 
      A[i][mid + inc + a + 1] = r; 
      a += width + 1; 
     } 
     inc++; 
    } 
    if(n > 1) 
     bintree(n - 1, A, offset + height/2, ++lvl); 
    return A; 
}; 
logtree(bintree(4)); 

and here's the fiddle.