2013-10-13 72 views
0

我需要打印(和):打印()用於預購的子樹預購子樹

 A 
    / \ 
    B  G 
/\ 
    C P 
    \ 
    E 

我試圖做的:

public StringBuilder preOrder(StringBuilder string) { 
     string.append(value); 
     if (left!=null || right!=null) 
      string.append("("); 
     if (left != null){ 
      left.preOrder(string); 
     } 
     if (left!=null && right!=null) 
      string.append(")"); 
     if (right != null){ 
      right.preOrder(string); 
     } 
     return string; 
    } 

然而,結果出來:

A(B(C(E)p)G

代替:

(A(B(C(E)P)G))

什麼是錯?

EDITED:

它必須是

(A(B(C(E())P())G()))

+0

能否請您詳細闡述更多? – Dejell

+0

你必須從空**()**開始。以**(**和返回之前,以**結尾)**開頭。如果樹是空的,你應該有()對嗎? 你能給我們提供更多信息嗎? –

+0

是的。如果它有一個元素,它將是(A)對於isntance – Dejell

回答

1

我發現這兩條線懷疑:

if (left!=null && right!=null) 
    string.append(")"); 
if (right != null){ 
    right.preOrder(string); 
} 

你插入一個右括號然後處理右孩子。正確的孩子之後的右括號在哪裏?

我想這會工作:

if (right != null){ 
    right.preOrder(string); 
} 
if (left != null || right != null) 
    string.append(")"); 

然後你還需要(分別)佔周邊括號(上面應該給你A(B(C(E)P)G),你需要添加周圍()中調用函數)。

在回答您的編輯:

既然你要不管添加生兒育女的支架,
只是刪除if (left != null || right != null)在兩種情況下:

public StringBuilder preOrder(StringBuilder string) { 
    string.append(value); 
    string.append("("); 
    if (left != null){ 
     left.preOrder(string); 
    } 
    if (right != null){ 
     right.preOrder(string); 
    } 
    string.append(")"); 
    return string; 
} 
+0

我編輯了我的問題 - 我還需要爲P和G設置他們有空的孩子。抱歉!無論如何,我投了票 – Dejell

+0

@Dejel編輯了我的答案。 – Dukeling