2016-07-11 11 views
0

私はバイナリツリーでプリオーダートラバーサルを実装しようとしていました。これは私のコードスニペットです。私のコードにエラーが表示される理由セグメンテーションフォールト(コアダンプされた)

#include <iostream> 
using namespace std; 

struct node{ 
    int data; 
    struct node *left; 
    struct node *right; 
}; 

struct node *root= NULL; 

struct node *inorder_search(struct node *node, int val){ 
    inorder_search(node->left,val); 
    if(node->data==val) return node; 
    inorder_search(node->right,val); 
} 

void insert(int data1, int data2, char subtree){ 
    struct node *current; 
    struct node *temp1; 
    struct node *temp2; 

    temp1->data= data1; 
    temp1->left= NULL; 
    temp1->right= NULL; 

    temp2->data= data2; 
    temp2->left= NULL; 
    temp2->right= NULL; 

    if(root==NULL){ 
     root= temp1; 
     if(subtree=='R'){ 
     root->right= temp2; 
     return; 
     } 
     else{ 
     root->left= temp2; 
     return; 
     } 
    } 
    else{ 
     current= inorder_search(root,data1); 
     if(subtree=='R'){ 
     current->right= temp2; 
     return; 
     } 
     else{ 
     current->left= temp2; 
     return; 
     } 
    } 
    } 

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

int main(void){ 
    int edges;//edges= no. of edges 
    cout<<"Enter the number of edges: "; 
    cin>>edges; 

    int i; 
    int relations= edges*3; 
    int *arr= new int[relations+1]; //since input is in the form 1 2 R 1 2 L where R= right subtree, L= left subtree 
    for(i=0; i<relations;i++) cin>>arr[i]; 

    for(i=0;i<relations;i+=3) insert(arr[i], arr[i+1], arr[i+2]); 

    preorder_traversal(root); 
} 

コードは、次の入力タイプ

1 2 L 1 3 R 

関数insert()、Iは、アレイの形で撮影された入力のツリーを作成しようとしているためです。 inorder_search()関数は、データが追加される左または右のサブツリーに特定のノードを検索するために使用され、insert()関数に返されます。例えば、1 2 L 1 3 Rにおいて、 '1'は、それぞれ、 '2'および '3'が左および右のサブツリーであるノードである。したがって、inorder_search()関数で '1'を検索し、それに応じて '2'または '3'が挿入されたノードをinsert()関数で返します。

誰かが私が間違っているところを説明し、それを実装するより良い方法があるかどうかを説明できますか?

+0

それは割り当てですか? –

+0

デバッガを使用して、コアダンプを調べます。どこで(stacktrace)それはクラッシュですか? –

+2

どこにも割り当てがありません。あなたはその 'insert'について確信していますか?いずれにせよ、これはC++よりもCです。 – Zeta

答えて

0

警告をオフにしてコンパイルしたようです。私はこれをコンパイルすると、私は次のメッセージを得た:

$ g++ -std=c++14 -fPIC -g -Wall -Wextra -Wwrite-strings -Wno-parentheses -Weffc++  38307710.cpp -o 38307710 
38307710.cpp: In function ‘node* inorder_search(node*, int)’: 
38307710.cpp:16:1: warning: control reaches end of non-void function [-Wreturn-type] 
} 
^ 
38307710.cpp: In function ‘void insert(int, int, char)’: 
38307710.cpp:23:22: warning: ‘temp1’ is used uninitialized in this function [-Wuninitialized] 
    temp1->data= data1; 
        ^
38307710.cpp:27:22: warning: ‘temp2’ is used uninitialized in this function [-Wuninitialized] 
    temp2->data= data2; 
        ^

さらに、Valgrindの下で実行することは、正確にどこに最初にアクセス無効な値を示している

==5113== Use of uninitialised value of size 8 
==5113== at 0x40093C: insert(int, int, char) (38307710.cpp:23) 
==5113== by 0x400B77: main (38307710.cpp:72) 
==5113== 
==5113== Invalid write of size 4 
==5113== at 0x40093C: insert(int, int, char) (38307710.cpp:23) 
==5113== by 0x400B77: main (38307710.cpp:72) 
==5113== Address 0x0 is not stack'd, malloc'd or (recently) free'd 
==5113== 
==5113== 
==5113== Process terminating with default action of signal 11 (SIGSEGV) 
==5113== Access not within mapped region at address 0x0 
==5113== at 0x40093C: insert(int, int, char) (38307710.cpp:23) 
==5113== by 0x400B77: main (38307710.cpp:72) 

を与えます。

関連する問題