2016-03-31 14 views
0

C++で算術式を格納するバイナリツリーを実装しています。しかし、ツリーにノードを挿入することにはいくつか問題があります。私は、要素とアドレスを解析することによってツリーにノードを挿入したい。ノードがツリーにアタッチされない

ノードがツリーにアタッチされないことが原因でクラッシュする可能性があります。

私はこの問題を解決するのに役立つことを願っています。算術式を格納するバイナリツリーを実装する他の方法のアイデアは大歓迎です。あなたの "insertNode()" メソッドに "ノード" と呼ばれるパラメータを渡す

struct Node{ 
    int element; 
    Node* left; 
    Node* right; 

    Node(int e){ 
     this->element = e; 
     this->left = NULL; 
     this->right = NULL; 
    } 

    bool isInternal(){ 
     return (this->left != NULL || this->right != NULL); 
    } 

    void print(){ 
     if(isInternal()){ 
      switch(this->element){ 
      case 1: 
       cout << " + "; 
       break; 
      case 2: 
       cout << " - "; 
       break; 
      case 3: 
       cout << " * "; 
       break; 
      case 4: 
       cout << "/"; 
       break; 
      } 
     } 
     else 
      cout << this->element; 
    } 

    bool hasLeft(){ 
     return (this->left != NULL); 
    } 

    bool hasRight(){ 
     return (this->right != NULL); 
    } 
}; 

class BinaryTree{ 
public: 
    Node* root; 

    void clearTree(Node* t){ 
     if(t == NULL) 
      return; 
     if(t->left != NULL) 
      clearTree(t->left); 
     if(t->right != NULL) 
      clearTree(t->right); 
     delete t; 
     return; 
    } 

    BinaryTree(){ 
     root = NULL; 
    } 

    ~BinaryTree(){ 
     clearTree(root); 
    } 

    bool isEmpty(){ 
     return (root == NULL); 
    } 

    Node* insertNode(int e, Node* node){ 
     Node* newNode = new Node(e); 
     node = newNode; 
     return node; 
    } 

    void printExpression(Node* node){ 
     if(node->hasLeft()){ 
      cout << "("; 
      printExpression(node->left); 
     } 
     node->print(); 
     if(node->hasRight()){ 
      printExpression(node->right); 
      cout << ")"; 
     } 
    } 
}; 
int main(){ 
    BinaryTree* bt = new BinaryTree(); 

    Node* root = bt->root; 
    bt->insertNode(1, root); 
    Node* n1 = bt->insertNode(3, root->left); 
    bt->insertNode(2, n1->left); 
    Node* n2 = bt->insertNode(2, n1->right); 
    bt->insertNode(4, n2->left); 
    bt->insertNode(1, n2->right); 
    Node* n3 = bt->insertNode(3, root->right); 
    bt->insertNode(3, n3->left); 
    bt->insertNode(5, n3->right); 

    bt->printExpression(root); 

    return 0; 
} 

答えて

0
Node* insertNode(int e, Node* node){ 
    Node* newNode = new Node(e); 
    node = newNode; 
    return node; 
} 

は、ここに私のプログラムです。新しいノードを作成し、それをパラメータに割り当てます。

これは絶対に何も行いません。だから何?この関数が返った後、そのパラメータで行ったことは完全に忘れ去られます。ちょうど遠い記憶。

insertNode()メソッドをどのように呼び出すかで判断すると、おそらくこの値を値ではなく参照で渡すことになります。

+0

はい、私はパラメータを参照渡ししません。しかし、私は実際にどのように知りません。私は、ポインタを渡しているリファレンスを渡していると思った、しかし、それはこの時間を動作していません。 – Linh

+0

'Node * insertNode(int e、Node *&node){...' –

+0

C++に関する良い本を入手してください。それは参照が何であるか、そして値渡しと参照渡しの違いについて説明します。 –

関連する問題