2016-11-09 19 views
-2

キューを使用してバイナリ検索ツリーでレベルオーバトラバーサルのコードを試していましたが、レベルを印刷しようとすると出力が得られない理由がわかりません注文。誰か助けてください!ライン83でバイナリ検索ツリー - Cでのレベルオーダートラバーサル

Link to my code.

#include <stdio.h> 
#include <stdlib.h> 

typedef struct 
{ 
    int data; 
    struct Node *right, *left; 
}Node; 

typedef struct 
{ 
    int front, rear, size; 
    unsigned capacity; 
    Node* arr[100]; 
}Queue; 

Queue* createQ() 
{ 
    Queue* q = (Queue*) malloc(sizeof(Queue)); 
    q->capacity = 100; 
    q->front = q->size = 0; 
    q->rear = q->capacity - 1; 
    return q; 
} 

int isEmpty(Queue* q) 
{ 
    return (q->size == 0); 
} 
int isFull(Queue* q) 
{ 
    return (q->size == q->capacity); 
} 
void enqueue(Queue* q, Node* item) 
{ 
    if (isFull(q)) 
     return; 
    q->rear = (q->rear + 1)%q->capacity; 
    q->arr[q->rear] = item; 
    q->size = q->size + 1; 
} 


Node* dequeue(Queue* q) 
{ 
    if (isEmpty(q)) 
     return NULL; 
    Node* item = q->arr[q->front]; 
    q->front = (q->front + 1)%q->capacity; 
    q->size = q->size - 1; 
    return item; 
} 

Node* create(Node* root, int data) 
{ 
    if(root==NULL) 
    { 
     root = (Node*)malloc(sizeof(Node)); 
     root->data = data; 
     root->left = root->right = NULL; 
     return root; 
    } 
    else 
    { 
     if(data>root->data) 
     { 
      root->right = create(root->right,data); 
     } 
     else 
     { 
      root->left = create(root->left,data); 
     } 
     return root; 
    } 
} 
void levelorder(Node* root) 
{ 
    if(root==NULL) return; 
    else 
    { 
     Queue* q = createQ(); 
     enqueue(q,root); 
     while(isEmpty(q)) 
     { 
      Node* temp = dequeue(q); 
      printf("%d ",temp->data); 
      if(temp->right) 
       enqueue(q,temp->right); 
      else if(temp->left); 
       enqueue(q,temp->left); 
     } 
    } 
} 

void main() 
{ 
    int data; 
    Node *root = NULL; 
    for(;;) 
    { 
     printf("\nEnter the elements (-1 to stop) : "); 
     scanf("%d",&data); 
     if(data==-1) break; 
     root = create(root,data); 
    } 
    printf("\nPrinting the elemtents in level order : "); 
    levelorder(root); 
} 
+1

それをデバッグしてください。 –

+1

オフサイトに保存されたコードへのリンクを投稿しないでください。問題のコードを投稿してください。それが大きい場合は、MCVE([MCVE])を作成してください。次に、MCVEコードを投稿します。 –

答えて

0

我々はキューが空でwhileループを実行したいと思うので、while(isEmpty(q))while(!isEmpty(q))でなければなりません。

私はバグが正しいことを望みます。

1

levelorder機能にいくつかのバグがあります。以下の訂正をご確認ください。私はあなたのバギーラインをサイドコメントにとどめました。

void levelorder(Node* root) 
{ 
    if(root==NULL) return; 
    else 
    { 
     Queue* q = createQ(); 
     enqueue(q,root); 
     while(!isEmpty(q)) // not while(isEmpty(q)) you have to check untill Queue is non-empty 
     { 
      Node* temp = dequeue(q); 
      printf("%d ",temp->data); 
      if(temp->right) 
       enqueue(q,temp->right); 
      if(temp->left) // not else if(temp->left); there can be right node and left node as well.. no semicolon 
       enqueue(q,temp->left); 
     } 
    } 
} 

その他のコードは大丈夫です。よく知られているいくつかのIDEを使用して自分でデバッグを練習する必要があります。

関連する問題