Я написал этот код для обхода уровня двоичного дерева поиска. Ошибка только в функции 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). Что случилось с моим кодом? Благодарю.
Я подозреваю, что ваше завершение цикла неверно.
Вместо 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);
}
}
}