0

適切に機能するために、ツリーを印刷する次の機能があります。

void PrintInOrder(TTreeNode const * const pRoot) {
    if (pRoot != 0) {
        PrintInOrder(pRoot->pLeft);
        if(pRoot->pLeft) std::cout << ",";
        std::cout << pRoot->Data;
        if(pRoot->pRight) std::cout << ",";
        PrintInOrder(pRoot->pRight);
    }
}

これは私の予約注文印刷機能です:

void PrintPreOrder(TTreeNode const * const pRoot)  {
    if (pRoot != 0) {
        std::cout << pRoot->Data << std::endl;
        PrintPreOrder(pRoot->pLeft);
        PrintPreOrder(pRoot->pRight);
    }
}

私は愚かすぎて、 inorder 関数のように印刷する方法を理解できないので、皆さんが私を助けてくれることを願っています!

ありがとう!

アップデート:

予約注文機能が機能するようになりましたが、これは正しい注文注文機能ですか?

void PrintPostOrder(TTreeNode const * const pRoot)  {
        if (pRoot != 0) {
            PrintPostOrder(pRoot->pLeft);
            if(pRoot->pLeft) std::cout << ",";
            PrintPostOrder(pRoot->pRight);
            if(pRoot->pRight) std::cout << ",";
            std::cout << pRoot->Data;
        }
 }
4

4 に答える 4

1
void PrintPreOrder(TTreeNode const * const pRoot)  {
    if (pRoot != 0) {
        std::cout << pRoot->Data << std::endl;
        if(pRoot->pLeft || pRoot->pRight) std::cout << ",";
        PrintPreOrder(pRoot->pLeft);
        if(pRoot->pLeft && pRoot->pRight) std::cout << ",";
        PrintPreOrder(pRoot->pRight);
    }
}

また、これによりツリーが事前注文トラバーサルで出力されることに注意してください。

于 2013-03-10T16:26:08.097 に答える
1

これはそれを行う適切な方法です:

void PrintPreOrder(TTreeNode const * const pRoot)  {
    if (pRoot != 0) {
        std::cout << pRoot->Data << std::endl;
        // take care of left node
        if(pRoot->pLeft || pRoot->pRight) std::cout << ",";
        PrintPreOrder(pRoot->pLeft);
        // take care of right node
        if(pRoot->pLeft && pRoot->pRight) std::cout << ",";
        PrintPreOrder(pRoot->pRight);
    }
}
于 2013-03-10T16:27:35.993 に答える
0
順序どおりのバージョン:
  1. 左のサブツリーにアクセスします。
  2. ルートのデータを出力します。
  3. 右のサブツリーにアクセスします。
プレオーダー版 でやりたいことは:
  1. ルートのデータを出力します。
  2. 左のサブツリーにアクセスします。
  3. 右のサブツリーにアクセスします。

したがって、次のようになります。

void PrintPreOrder(TTreeNode const * const pRoot) {
    if (pRoot) {

        // print the root:
        std::cout << pRoot->Data;
        
        // visit the left subtree:
        if (pRoot->pLeft) {
            std::cout << ",";
            PrintPreOrder(pRoot->pLeft);
        }
        
        // visit the right subtree:
        if (pRoot->pRight) {
            std::cout << ",";
            PrintPreOrder(pRoot->pRight);
        }
    }
}
于 2013-03-10T16:35:43.573 に答える
0

私はこれが何年も前のものであることを知っていますが、それでも役に立ちます!

私はこれを自分で行う方法を考えていて、この質問を見つけましたが、簡単な答えがあることに気付きました:

void Preorder(Node* root){
  if(root==NULL){
    return;
  }
  cout << root->data << " ";
  Preorder(root->left);
  Preorder(root->right);
}

ツリーのルートから始めます。ルートが の場合null、コードは完了です。

それ以外の場合は、そのノードのデータを出力します。

Preorder次に、そのノードのleftandサブツリーを呼び出しrightます。これはroot、独自のサブツリーの です。これは予約注文であるため、最初に左側のサブツリーを呼び出すことが重要です (ポスト オーダーの場合は右側のサブツリー)。

rootがであるかどうかをチェックするので、左側のサブツリーが であるか、サブツリーが個別であるかnullを心配する必要はありません。ノードが の場合は、バックトラックします。nullrightnullnull

于 2015-10-10T20:43:50.033 に答える