2012-05-02 93 views
0

我決定嘗試自學自己如何編程,並正在通過Python版本的「如何像計算機科學家一樣思考」。試圖阻止提問有關練習(因爲整個問題是要自己解決),但這一個讓我難住。用樹枝遍歷圓括號

在第20章介紹了Inorder遍歷(使用表達式1 + 2 * 3)和遍歷樹並打印每個節點的函數之後,它接着詢問:「修改printTreeInorder,以便將括號放在每個運算符和一對操作數「。因此,我假設輸出應該看起來像(1+(2)* 3)。

我一般都在爲遞歸函數而奮鬥,並且正在爲此而掙扎。我嘗試在左右調用之前和之後插入圓括號,但這並沒有奏效,現在我認爲函數堆棧將會深入五層 - 不會看到如何得到兩對圓括號。

感覺像一個警察問,但任何人都可以讓我在這條正確的軌道上?

謝謝,

比利。

回答

2

把括號輪的每一個操作和對操作數。」我這樣假設輸出應該像(1+(2)*3)

我不認爲這應該是輸出。我覺得應該輸出是:(1+(2*3))

對於我查看最簡單的方法就是通過面向對象的方法

。抽象類Node抽象方法GetExpressionString()字段Token

讓從NodeOperand繼承,並實現GetExpressionString(),使其返回Token。 (例如'1''2''3')。

Operator繼承Node,有領域LeftNodeRight和實施GetExpressionString(),使其返回'(' + Left.GetExpressionString() + Token + Right.GetExpressionString() + ')'。例如,如果Left = '2'Right = '3'Token = '*',則結果是'(2*3)'

那麼對於

expression = new Operator(
       Token='+', 
       Left=new Operand(Token='1'), 
       Right=new Operator(
         Token='*', 
         Left=new Operand(Token='2'), 
         Right=new Operand(Token='3'))) 

expression.GetExpressionString()回報'(1+(2*3))'通話。

1

這段代碼在C++應該爲你工作:

void inorder(node1 *start) 
{ 
    if(!(start->left==NULL && start->right==NULL)) 
    cout<<"("; 
    if(start->left!=NULL) 
    inorder(start->left); 
    cout<<start->value; 
    if(start->right!=NULL) 
    inorder(start->right); 
    if(!(start->left==NULL && start->right==NULL)) 
    cout<<")"; 
}