2016-12-30 20 views
-3

バイナリツリー用のC++プログラムを作成しました。しかし、端末は、要素が配置されるべき方向を入力するためのステートメントを要求していない。 また、 "node * temp = new node"のステートメントを "node * temp = NULL"に置き換えると、プログラムの動作が停止します。C++プログラムの出力が期待通りに行われない

#include <iostream> 
#include <cstring> 

using namespace std; 
class node { 
    int data; 
    node * left; 
    node * right; 
public: 
    node * level_order(node * first); 
    node * create_bt(node * first); 
    void display(node * first); 
}; 
//node *first=NULL; 

node * node::create_bt(node * first) { 
    node * temp = new node; 
    int ele; 
    //char dir; 
    cout << "\n Enter data "; 
    cin >> ele; 
    temp->data = ele; 
    temp->left = NULL; 
    temp->right = NULL; 

    if (first == NULL) { 
     temp = first; 
     return first; 
    } else { 
     char dir[20]; 
     cout << "\n Enter the direction "; 
     cin >> dir; 
     node * cur = first; 
     int j = 0; 
     while (dir[j] != '\0') { 
      if (dir[j] == 'l') { 
       cur = cur->left; 
      } 
      if (dir[j] == 'r') { 
       cur = cur->right; 
      } 
      j++; 
     } 
     cur = temp; 
     return first; 
    }  
} 

void node::display(node * first) { 
    if (first == NULL) 
     return; 
    cout << "\n " << first->data; 
    display(first->left); 
    display(first->right); 
} 

int main() { 
    int n; 
    node s; 
    node * first = NULL; 
    cout << "\n No of elements "; 
    cin >> n; 
    for (int i = 0; i < n; i++) { 
     first = s.create_bt(first); 
    } 
    s.display(first); 
    return 0; 
} 
+1

質問をする前に、コードを正しくフォーマットしてください。以前の形式が実際に自分のコードで使用していたものだった場合は、後の作業で独自のコードを維持しようとするとよいでしょう。 – Zeta

答えて

0

first = s.create_bt(first);状態をNULLから 'l'または 'r'に変更しません。あなたはそれを変更する必要があります。

node*node::create_bt(node *first) 
{ 
    node *temp=new node; 
    int ele; 
    //char dir; 
    cout<<"\n Enter data "; 
    cin>>ele; 
    temp->data=ele; 
    temp->left=NULL; 
    temp->right=NULL; 
    char dir[20]; 
    cout<<"\n Enter the direction "; 
    cin>>dir; 
    if(first==NULL) 
    { 
     temp=first; 
     return first; 
    } 
    else 
    { 
     node*cur=first; 
     int j=0; 
     while(dir[j]!='\0') 
     { 
      if(dir[j]=='l') 
      { 
       cur=cur->left; 
      } 
      if(dir[j]=='r') 
      { 
       cur=cur->right; 
      } 
      j++; 
     } 
     cur=temp; 
     return first; 
    } 

} 
+0

しかし、ポインタを最初のノードに戻しているためです。それはなぜできないのですか? –

+0

"最初の== NULL"をチェックするif文の場合は、 "node * first = NULL;"のため真です。 main()で宣言したものです。実行: – Paulkokos

+0

ifステートメントと最初の値を返します。 – Paulkokos

0

私はあなたがこのような何かを探して再信じています。これは基本的なバイナリツリーです。どのように動作し、どのように左右を選択するかを理解するために基本的なツリーを作成しなければなりませんでした。データメンバ(ノードクラス、intデータ、* left、* right)にアクセスし、それらを同時に保護し、オールインワンにするために、クラス内でクラスを作成します。あなたが見ることができるように、 "newnode"は単にノードを作成し、ポインタはNULLです。それでおしまい。 "Find"は、現在のキーを持つノードを検索して検索し、終了時にそれを返します。残りの部分はすべて、あなたのコードとほとんど同じであるため、それらを理解することができます。あなたがしなければならないのは、あなたが望むノードを指示したいときに定義することだけです。注意:それを利用する方法を見つけなければならないので、リーフは遠く左端または右端に終わらないでしょう(「方向を入力してください」)。私はあなたが理解するのを助けたと思います。

#include <iostream> 
#include <conio.h> 

using namespace std; 
class mybTree { 
class node { 
public: 
    int data; 
    node * left; 
    node *right; 
}; 
node *root; 
node *newnode(int num){ 
    node *newnode1; 
    newnode1 = new (nothrow) node; 
    newnode1->data = num; 
    newnode1->left = NULL; 
    newnode1->right = NULL; 
    return newnode1; 
} 

public: 
node *find (int key) { 
    node *current; 
    current = root; 
    while (current->data !=key){ 
     if (key<current->data){ 
      current = current->left; 
     } else { 
      current = current->right; 

     } 
     if (current == NULL){ 
      return NULL; 
     } 
    } 
    return NULL; 
} 

void display (node *ptr); 
void display_tree(); 
bool insert(int num); 

void post_order_delete(node *ptr); 
mybTree(); 
~mybTree(); 
}; 
int main(){ 
char ch = ' '; 
int a; 
mybTree mybTree1; 
while (ch !='0'){ 
    cout << "0->Exit"<<endl<< "1-> add"<<endl<< "2-> find" <<endl<<"3-> Show me the tree\n"; 
    ch = getch(); 
    switch (ch) { 
     case '0': 
      break; 
     case '1': 
      cout << "number"; 
      cin >> a; 
      if (!mybTree1.insert(a)){ 
       cout << "Not enough memory" << endl; 
      } 
      break; 
     case '2' : 
      cout << "Number:" ; 
      cin >> a; 
      if (mybTree1.find(a)!=NULL) { 
       cout << "Found" << endl; 
      } else { 
       cout << "Not existed" << endl; 
      } 
      break; 
     case '3': 
      mybTree1.display_tree(); 
      cout<<endl; 
      break; 
     default: 
      cout << "Wrong Message"; 
      break; 
    } 
} 
return 0; 
} 

void mybTree::display(node *ptr) { 
if (ptr == NULL){ 
    return; 
} 
display(ptr->left); 
cout << ptr->data<<endl; 
display(ptr->right); 
} 

void mybTree::display_tree() { 
//Displays the Tree 
display(root); 
} 

bool mybTree::insert(int num) { 
//It inserts a node. Desides left or right. 
node *next,*current,*ptr; 
int isleft; 
next = current = root; 
ptr = newnode(num); 
if (ptr == NULL) { 
    return false; 
} 
if (root == NULL) { 
    root = ptr; 
    return true; 
} 
while (1){ 
    if (num < current->data){ 
     next = current->left; 
     isleft = 1; 
    } else { 
     next = current->right; 
     isleft = 0; 
    } 
    if (next == NULL){ 
     if (isleft){ 
      current->left = ptr; 
     } else { 
      current->right = ptr; 
     } 
     return true; 
    } 
    current=next; 
} 
return false; 
} 

void mybTree::post_order_delete(node *ptr) { 
//deletes the node. Usefull for destructor 
if (ptr == NULL){ 
    return; 
} 
post_order_delete(ptr->left); 
post_order_delete(ptr->right); 
cout << ptr->data; 
delete ptr; 
} 

mybTree::mybTree() { 
//Constructor 
root = NULL; 
} 

mybTree::~mybTree() { 
//Destructor 
post_order_delete(root); 
root = NULL; 
} 
関連する問題