Почему не работает моя функция printLevel?

0

Я написал этот код для обхода уровня двоичного дерева поиска. Ошибка только в функции printLevel, потому что все остальные функции работают нормально.

#include <queue>
using namespace std;
struct node{
int data;
struct node* left;
struct node* right;
};

struct node* newNode(int data){
struct node* node = new (struct node);
node->data=data;
node->left=NULL;
node->right=NULL;
return (node);
};
struct node* insert (struct node* node, int data){
if (node==NULL){
    return (newNode(data));
}
else {
    if (data<=node->data) node-> left=insert(node->left,data);
    else node->right=insert(node->right,data);
    return (node);
}

}

void printLevel(struct node* node){
    queue<struct node*> q;
    while(node!=NULL){
        cout << node->data << " ";
        q.push(node->left);
        q.push(node->right);
        node=q.front();
    }
}
int main(){
    int n;
    cin >>n;
    int m;
    cin >>m;
    struct node* root=newNode(m);
    for (int i=0;i<n-1;i++){
        cin>>m;
        insert(root,m);
    }
    printLevel(root);
//  printPostOrder(root);
//  cout <<maxDepth(root);
//  debug(maxDepth(root),   minValue(root), printTree(root));
    //struct node* root=build123();
}

Вот алгоритм: (http://www.geeksforgeeks.org/level-order-tree-traversal/)

printLevelorder (дерево)

1) Создать пустую очередь q

2) temp_node = root/start from root/

3) Loop while temp_node не равен NULL

a) print temp_node->data.

b) Enqueue temp_nodes children (first left then right children) to q

c) Dequeue a node from q and assign its value to temp_node

Я принимаю ввод 3,1,4,2,7,6,5 для 7 узлов. Он застревает в бесконечном цикле. Я также реализовал следующие две функции, основанные на другом методе, и он отлично работает:

   void levelOrder(struct node* node, int level ){
    if (node==NULL){
        return;
    }
    if (level==1){
        cout << node->data;
    }
    else if (level>1){
        levelOrder(node->left,level-1);
        levelOrder(node->right,level-1);

    }
}
void printLevelOrder(struct node* root){
    for (int i=1;i<=maxDepth(root);i++){
        levelOrder(root,i);
    }
}

Это O (n ^ 2), но выше единицы O (n). Что случилось с моим кодом? Благодарю.

Теги:
tree
stl
queue

1 ответ

1

Я подозреваю, что ваше завершение цикла неверно.

Вместо node != NULL, вы должны проверить, есть ли !q.empty().

Кроме того, вызов q.front не удаляет элемент из очереди; для этого вам нужно pop (после вызова front).

Этот код работает для меня:

void printLevel(struct node* node){
    std::queue<struct node*> q;
    q.push(node);
    while(!q.empty()) {
        node=q.front();
        q.pop();
        if ( node != NULL ) {
            std::cout << node->data << " ";
            q.push(node->left);
            q.push(node->right);
            }
    }
}
  • 0
    +1 ваши подозрения обоснованы. Фактический алгоритм состоит в том, чтобы протолкнуть первый узел при входе, а затем выполнить цикл, выталкивая узел из очереди, печатая его, выдвигая его дочерние элементы, повторяя, пока очередь не станет пустой.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню