[英]Binary Search Tree Printing
我正在為學校編寫Binary Tree程序,並且一切正常。 我現在要做的就是正確的輸出。 我的老師希望輸出的結果是所有數字,其后跟逗號。
我的代碼完美地將數字排序並打印出來,但我不確定如何刪除最后一個數字后的逗號。
電流輸出:1,2,3,4,
需要為:1、2、3、4
這是我的代碼:
void BinaryTree::inorder(tree_node* p)
{
if(p != NULL)
{
if(p->left)
inorder(p->left);
cout << p->data << ", ";
if(p->right)
inorder(p->right);
}
else
return;
}
我已經嘗試了一些方法來使其正確,但是我無法弄清楚。
任何幫助都會很棒。
謝謝。
一種簡單的方法是像這樣在數據之前打印分隔符
cout << ", " << p->data;
這樣,我們將您的問題更改為跳過打印第一個逗號。 這要容易得多。 提示:為了跟蹤是否跳過逗號,您可能需要在函數中引入另一個參數,因為它是遞歸函數。
正如xmoex所指出的那樣,有一種更優雅的方式來打印此樹,從而產生非常易讀和邏輯的代碼。 嘗試找到這種方式來應對其他挑戰。
一個不相關的提示:您可以刪除return語句,因為它是多余的-該函數仍然會返回! 像這樣:
void BinaryTree::inorder(tree_node* p)
{
if (p != NULL)
{
// stuff goes inside here!
}
// no return here - the function will return anyway
}
這樣可以減少不必要的代碼,並在需要(例如)在作業到期日之前快速對其進行調試時,可以幫助您閱讀自己的代碼。
也許您需要對問題有另一種看法。 認為一個節點是
<left subtree> p->data <right subtree>
目前,您的節點打印像
<left subtree> p->data ", " <right subtree>
每次都會導致尾隨", "
但是您不想在每個元素上都打印", "
。
->您只想在下降到子樹時( 且僅當! )時在正確的位置打印", "
(在正確的位置),否則不需要分隔符...
有一個非常簡單,非常優雅的方法來實現此目標,而無需攜帶任何其他數據……隨時詢問您是否需要進一步的幫助……
更新:由於我認為您的作業已經結束,所以我想展示我的解決方案:
void BinaryTree::inorder(tree_node* p)
{
if(p != NULL)
{
if(p->left)
{
inorder(p->left);
cout << ", "; // print ", " everytime after you descended to the left
}
cout << p->data;
if(p->right)
{
cout << ", "; // print ", " everytime before you descend to the right
inorder(p->right);
}
}
}
它應該看起來像
<left subtree ", "> p->data <", " rightsubtree>
我想說您設置了一個布爾標志,該標志通過引用您的打印例程傳遞(並且打印例程在遞歸時傳遞該標志)。
最初,該標志設置為false。 當您要打印某些東西時,請檢查標志。 如果為false,則將flag設置為true並打印您的元素。 如果已經存在,請打印一個逗號,一個空格和您的元素。
您可以引入max()
方法,該方法將指針返回最右邊的節點,然后僅比較當前節點的指針是否等於最大節點的指針。
tree_node* BinaryTree::max(tree_node *p) {
if(p != NULL && p->right != NULL) return max(p->right);
return p;
}
您將需要一個包裝器方法來調用inorder()
並傳遞最大值,因為您不想在每次遞歸調用中都計算最大值。
void BinaryTree::print() {
inorder(root, max(root));
}
void BinaryTree::inorder(tree_node *p, tree_node *max) {
if(p == NULL) return;
if(p->left) inorder(p->left, max);
cout << p->data;
if(p != max) cout << ", ";
if(p->right) inorder(p->right, max);
}
更改
cout << p->data << ", ";
if(p->right)
{
inorder(p->right);
}
進入
cout << p->data;
if(p->right)
{
cout << ", ";
inorder(p->right);
}
即,只有在確定正確的孩子中有東西的情況下,才打印逗號。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.