2017-08-01 12 views
0

の左側のビューを表示しながら、私は次のように自分で木を初期化している: - (私は大きいため、コードを削除している)他のすべての機能が働いていたため、私は、上記のプログラムを実行するとエラー木

#include<iostream> 
#include<queue> 
#include<string> 
using namespace std; 
struct node{ 
    int data = 0; 
    node* left = nullptr; 
    node* right = nullptr; 
}; 
void construct(struct node* &tree) 
{ 
    tree->data = 66; 
    tree->left = new node; 
    tree->right = new node; 
    tree->left->left = new node; 
    tree->left->left->left = new node; 
    tree->left->left->right = new node; 
    tree->left->left->left->left = new node; 
    tree->left->left->left->right = new node; 
    tree->left->left->left->right->right = new node; 
    tree->right->right = new node; 
    tree->right->left = new node; 
    tree->right->left->left = new node; 
    tree->right->left->right = new node; 
    tree->right->left->right->left = new node; 
    tree->left->data = 50; 
    tree->left->left->data = 46; 
    tree->left->left->left->data = 89; 
    tree->left->left->right->data = 37; 
    tree->left->left->left->left->data = 53; 
    tree->left->left->left->right->data = 81; 
    tree->left->left->left->right->right->data = 86; 
    tree->right->data = 72; 
    tree->right->left->data = 78; 
    tree->right->right->data = 71; 
    tree->right->left->left->data = 87; 
    tree->right->left->right->data = 35; 
    tree->right->left->right->left->data = 17; 
} 
void show_tree_view(struct node* const &tree, string view) 
{ 
    queue<struct node*> box; 
    box.push(tree); 
    cout << box.front()->data << " "; 
    int size = box.size(); 
    while(!box.empty()) 
    { 
     for(int i = 0; i < size; ++i) 
     { 
      struct node* current = box.front(); 
      box.pop(); 
      if(current->left != nullptr) box.push(current->left); 
      if(current->right != nullptr) box.push(current->right); 
     } 
     size = box.size(); 
     if(view == "left") cout << box.front()->data << " "; 
     if(view == "right") cout << box.back()->data << " "; 
    } 
    cout << endl; 
} 
int main() 
{ 
    struct node* tree = new node; 
    construct(tree); 
    /*int height = calculate_height_by_recursion(tree); 
    cout << "height with recursion : " << height << endl; 
    height = calculate_height_without_recursion(tree); 
    cout << "height without recursion : " << height << endl;*/ 
    cout << "Left view of tree is : "; 
    show_tree_view(tree, "left"); 
    //cout << "Right view of tree is : "; 
    //show_tree_view(tree, "right"); 
    return 0; 
} 

ただし、左右のビューを表示する機能は動作していません。どちらもエラーを示していません。私はプログラムを実行すると、セグメンテーション違反を示しています - 出力 -

[email protected]:~/Ujjal$ ./simple_tree 
Segmentation fault (core dumped) 

私は上記のデバッグが、バグをキャッチすることができませんでした。提案が必要です。

+0

この狂ったコードをデバッグする準備ができていませんでしたか?また、 'node'をどこにでも置く必要はありません。 C++は 'C'ではありません。 – PaulMcKenzie

+0

@ PaulMcKenzieこれは、高さを計算するためのコード(レベルオーダートラバーサルを使用)を書いたときにうまくいき、同じコードをコピーして貼り付けてコアダンプを表示するためです。それはあなたが知っている本当に迷惑だ;) –

答えて

0

一つのエラーはあなたのshow_tree_view機能がstd::queueがここに空であるかどうかを確認するために失敗したということです。

このコード前へ
if (view == "left") cout << box.front()->data << " "; 
if (view == "right") cout << box.back()->data << " "; 

、あなたはこのようにboxが潜在的に空である、ループ内でbox.pop()と呼ばれます。

Visual Studioを使用してコードを実行して実行しましたが、上記の行を指すエラーで停止しました。実際にはsizeは0なので、box.front()box.back()を呼び出すと、未定義の動作(あなたの場合はセグメンテーションフォルト)が発生します。

最初にbox.empty()にチェックし、空でない場合は、box.front()box.back()に電話をかけても安全です。

+0

よ、私にチェックさせてください。 –

+0

はい、私はそれを持っています。どうもありがとうございました。あなたは私の多くの時間を節約しました。 –