2009-12-08 91 views
1

我正在一個二叉搜索樹.. 我有一個問題讓節點左對齊輸出。我正在打印陣列順序,預訂,inorder,postorder ...陣列順序格式左對齊,就像我想要它.. 我基本上使用相同的代碼(setw和左;在同一順序)作爲數組順序因爲我與preo訂單,其餘.. 但是,它不會左對齊..問題格式化輸出c + +

我已經嘗試了一切.. 任何技巧?

正確的輸出..

Database Of Great Computer Scientists 

>>> array order: 

name      leaf? index 
----      ----- ----- 
Ralston, Anthony      0 
Liang, Li        1 
Von Neumann, John      2 
Jones, Doug       3 
Trigoboff, Michael     5 
Goble, Colin    leaf  7 
Knuth, Donald       8 
Turing, Alan    leaf  12 
Kay, Alan     leaf  17 
(items printed)       (9) 

>>> preorder: 


name      leaf? index 
----      ----- ----- 
Ralston, Anthony      0 
Liang, Li        1 
Jones, Doug       3 
Goble, Colin    leaf  7 
Knuth, Donald       8 
Kay, Alan     leaf  17 
Von Neumann, John      2 
Trigoboff, Michael     5 
Turing, Alan    leaf  12 
(items printed)       (9) 

>>> inorder: 


name      leaf? index 
----      ----- ----- 
Goble, Colin    leaf  7 
Jones, Doug       3 
Kay, Alan     leaf  17 
Knuth, Donald       8 
Liang, Li        1 
Ralston, Anthony      0 
Trigoboff, Michael     5 
Turing, Alan    leaf  12 
Von Neumann, John      2 
(items printed)       (9) 

>>> postorder: 


name      leaf? index 
----      ----- ----- 
Goble, Colin    leaf  7 
Kay, Alan     leaf  17 
Knuth, Donald       8 
Jones, Doug       3 
Liang, Li        1 
Turing, Alan    leaf  12 
Trigoboff, Michael     5 
Von Neumann, John      2 
Ralston, Anthony      0 
(items printed)       (9) 

>>> retrieve Trigoboff, Michael 

Trigoboff, Michael 

>>> retrieve Kaye, Danny 

not found 

這裏是序代碼。功能其餘的都是在其成立輸出的方式幾乎相同..

void BST::displayInOrder(ostream& out, int parent)const 
{ 
if (parent <= maxsize) 
{ 

this->displayInOrder(out, 2 * parent + 1); 

if (!items[parent].empty) 
{ 
out << left 
<< setw(27) << items[parent].instanceData; 
out << right 
<< setw(10); 
if(!items[parent].isLeaf) 
{ 
out << left 
<< setw(11) << "leaf"; 

} 
out << setw(12) << parent; 
out << endl; 
} 

this->displayInOrder(out, 2 * parent + 2); 

} 

if(!parent) 
{ 
itemsPrinted(out,size); 
} 

} 

這裏是左對齊排列順序代碼..

void BST::displayArrayOrder (ostream& out) const 
{ 

out << ">>> array order:" << endl; 
displayHeaders(out); 


for(int index=0; index < maxsize+1; index++) 
{ 

if (!items[index].empty) 
{ 
out << left 
<< setw(27) << items[index].instanceData; 
out << right 
<< setw(10); 

if(index > size) 
{ 
items[index].isLeaf = false; 
out << left 

<< setw(10) << "leaf"; 
} 
if(items[2*index+1].empty && items[2*index+2].empty && index < size) 
{ 
    items[index].isLeaf = false; 
    out << left 

<< setw(11) << "leaf"; 
} 

out << setw(12) << index; 
out << endl; 


} 


} 
if(!parent) 
{ 
itemsPrinted(out,size); 
} 


    } 
+0

這個功課? – 2009-12-08 07:14:54

回答

3

幫自己一個忙:寫one功能用於顯示記錄,並在需要顯示該類型記錄的任何位置使用該功能。既然你已經有了可以在一個地方工作的代碼,只需在你的print_record()(或者你決定調用它的任何東西)的主體內使用該代碼即可。

你應該儘快學會一件事:複製相同的基本代碼三次或四次以上是一個真正的不好的事情,你應該避免它。

+0

函數中setw和left的順序是相同的。每個功能都顯示inorder或postorder,並且代碼是不同的。在這種情況下,我必須檢查不同的事情,因此很難得到另一個顯示功能來處理顯示功能。 – Steller 2009-12-08 04:32:40

+3

您訪問節點的順序應該與您顯示單個節點數據的方式無關。 – 2009-12-08 04:36:52

1

當我看到您的代碼時,displayArrayOrder不僅顯示順序,而且還設置了isLeaf屬性,該屬性然後直接用於其他顯示功能。正如Jerry Coffin指出的那樣,在所有顯示功能中分割這些東西,並使用相同的打印記錄功能。

這樣的事情應該讓你開始。 (顯然,打印leafisLeaf是假的,我一直在該公約)

bool BST::hasToPrintLeaf(int index) { 
    if (!items[index].isLeaf) { 
    return true 
    } 
    if (index > size || 
     (index < size && items[2*index+1].empty && items[2*index+2].empty)) { 
    items[index].isLeaf = false; 
    return true; 
    } 
} 

void BST::printRecord(std::ostream & out, int index) { 
    out << left << setw(27) << items[index].instanceData; 
    out << right << setw(10); 

    if(hasToPrintLeaf(index)) { 
    out << left << setw(11) << "leaf"; 
    } 

    out << setw(12) << index << endl; 
} 

請注意,我並沒有真正關於你的邏輯改變什麼,而我有我的一些事情的疑惑...(你的兩個葉子測試排除索引==大小作爲例子)

+0

這實際上運作良好。我用它的後序,順序,預先排序..但是,當我打印「葉」我不能得到7排隊像其他節點葉數。可能是因爲它的一個數字,其他的不是。 – Steller 2009-12-09 01:26:57