2016-09-27 8 views
0
struct Tnode { 
Tnode *left; 
Tnode *right; 
int content; 

Tnode (int item = 0) { 
    this->content = item; 
    left = nullptr; 
    right = nullptr; 
}}; 


class KrTree { 
private: 
Tnode* root; 

void printHelper (Tnode* root) { 
    if(!root) { 
     return; 
    } 
    printHelper(root->left); 
    cout << root->content << " "; 
    printHelper(root->right); 
} 

void addHelper (Tnode *root, int item) { 
    if (root->content < item) { 
     if (root->right) { 
      addHelper(root->right, item); 
     } else { 
      root->right = new Tnode (item); 
     } 

    }else { 
     if (root->left) { 
      addHelper(root->left, item); 
     } else { 
      root->left = new Tnode (item); 
     } 
    } 
} 

public: 
// KrTree(){ 
// } 

void addTreeNode (int item) { 
    if (root){ 
     this->addHelper(root, item); 
    } else { 
     root = new Tnode(item); 
    } 
} 

void tnodes_count() { 

} 

void deleteTreeNode() { 

} 

void printTree() { 
    printHelper (this->root); 
} 

//~KrTree(){}}; 

上記はバイナリ検索ツリーを意味しています。私は私のc torとd torにコメントしています。私の問題はコードが上手く動作していますが、私のc-torとd-torを有効にするとセグメンテーション違反が発生します。私はここで非常に愚かな何かが欠けていますことを知っているがc-torとd-torを持つと、セグメンテーションフォールトが発生しますが、セグメンテーションフォールトが発生しない場合は

KrTree* tree = new KrTree(); 
tree->printTree(); 
tree->addTreeNode(7); 
tree->addTreeNode(2); 
tree->addTreeNode(10); 
tree->addTreeNode(1); 
tree->addTreeNode(5); 
tree->addTreeNode(9); 
tree->addTreeNode(20); 

tree->printTree(); 

:ここ

は、クライアントコードです。私のc-torを有効にするホエーを教えてください。そして、d-torはセグメンテーションエラーを返します。

+0

マイナーなタイプミス//〜KrTree(){}}; – Amaresh

+0

[ideone](http://ideone.com/jkoXkV)で正常に動作します。具体的にはセグメンテーションフォルトがどこにあるのですか?それは何を書いたり、逆参照しようとしていますか?どのようなコンパイラなどを使用していますか? – Rup

+0

@Amaresh * c-torとd-torを持つとセグメンテーションフォールトは発生しませんが、セグメンテーションフォールトがない場合* - もちろん、バグ関数が呼び出されていないとエラーは表示されません。 – PaulMcKenzie

答えて

0

コンストラクタなしKrTree.rootはデフォルトで0の値で初期化されます。コンストラクタでは、まあ、起こりません。 addTreeNodeはこの値を参照として使用しようとし、セグメント化エラーが発生します。 Visual Studioのデバッグモードのデフォルト値は0xcdcdcdcdcdcdcdcdのようなものです。最初のaddTreeNodeまでアプリケーションをデバッグし、rootの実際の値を見ることができます。 これを修正するには、メンバー変数の値をコンストラクタで即座に初期化する必要があります。例:デフォルトを示すコードから

私のコメントを1として
KrTree() : root(nullptr) { 
} 
+0

私はそれを知っていた。私はなんらかの汚れていた。ありがとう。 – Amaresh

+0

"コンストラクタなしでKrTree.rootはデフォルト値0で初期化されます。" - それは本当であるか分からない。事故によって発生する可能性がありますが、メンバーは静的な値と同じ方法で初期化されることは保証されません。また、何も指定しなかった場合、コンパイラがデフォルトで同じデバッグinitコンストラクタを生成しない理由はわかりません。 – Rup

1

...

はKrTreeが初期化されていないルート部材を有する構築しました。あなたが見ているのは、単に定義されていない動作です。

関連する問題