簡體   English   中英

二進制搜索樹打印

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM