1
          a
        /    \ 
       a       a
      / \     /  \
     a   c    a   f 
    / \      / \ 
   b   d    e   g

リンクされた構造で表される、上記のようなツリーがあります。

   class Node
    {
       Node* leftChild; 
       Node* rightChild; 
       char data;
    }

class Tree
{
   Node* root;
}

私の目標は、ルートノードからリーフノードまでのすべてのパスを見つけることです。

私のツリートラバーサルアルゴリズムは次のようになります。

 void inorder()
  {
    in(root);
  }

  void in(CharNode* currentNode)
  {
    if(currentNode)
      {   
        in(currentNode->leftChild);
        cout << currentNode->data << endl;
        in(currentNode->rightChild);
      }   
  }

これを実行すると、図のようにツリーが構築されていることを確信しています。私はそれをテストしました。ただし、ツリートラバーサルセグメンテーション違反が発生する理由を理解できません。

私が得る出力は次のとおりです:

b

Segmentation fault.

私はそれをより低い高さの木でテストしました、そしてそれは働きます。しかし、どういうわけか、高さが2を超える木では機能しません。木に問題があると思ったので、親、左の子、右の子をそれぞれ調べて印刷し、図のように印刷しました。 。したがって、これは間違いなくトラバーサルアルゴリズムです。

4

2 に答える 2

3

ツリーを構築するときは、ノードでleftChildとrightChildを必ずNULL(0)に初期化してください。これは、リーフノードおよびleftChildまたはrightChildのいずれかが欠落しているノードにとって重要です。

class Node
      : leftChild(0)
      , rightChild(0)
      , data(0)
{
   Node* leftChild; 
   Node* rightChild; 
   char data;
}
于 2012-07-29T06:45:48.500 に答える