6
void traverse(Node* root) 
{ 
    queue<Node*> q; 

    Node* temp_node= root; 

    while(temp_node) 
    { 
     cout<<temp_node->value<<endl; 

     if(temp_node->left) 
      q.push(temp_node->left); 

     if(temp_node->right) 
      q.push(temp_node->right); 

     if(!q.empty()) 
     { 
      temp_node = q.front(); 
      q.pop(); 
     } 
     else 
      temp_node = NULL; 
    } 
} 

Le code ci-dessus est affiché ma commande de niveau code traversal. Ce code fonctionne bien pour moi mais une chose que je n'aime pas, c'est que j'initialise explicitement temp_node = NULL ou que j'utilise le break. Mais cela ne semble pas être un bon code pour moi.niveau d'un ordre Traversal Binary Tree

Y a-t-il une implémentation soignée ou comment puis-je améliorer ce code?

+0

Indenter avec onglet de cohérence. – Potatoswatter

+1

Oh, ce n'est pas aussi appelé 'level-order'. Il est généralement appelé «largeur d'abord» par opposition à «profondeur d'abord». – Omnifarious

+0

@MOnifarious IMHO, 'level-order' est beaucoup plus expressif et succinct que la terminologie' breadth first search' (BFS). Juste aller niveau par niveau en traversant. Aussi simple que cela puisse paraître! – RBT

Répondre

11
void traverse(Node* root) 
{ 
    queue<Node*> q; 

    if (root) { 
     q.push(root); 
    } 
    while (!q.empty()) 
    { 
     const Node * const temp_node = q.front(); 
     q.pop(); 
     cout<<temp_node->value<<"\n"; 

     if (temp_node->left) { 
      q.push(temp_node->left); 
     } 
     if (temp_node->right) { 
      q.push(temp_node->right); 
     } 
    } 
} 

Il n'y a plus de cas particulier. Et l'indentation est nettoyée afin qu'elle puisse être comprise plus facilement.

variante:

aménagée comme une boucle for. Personnellement, j'aime la variable supplémentaire. Le nom de la variable est un raccourci plus agréable que de dire 'q.front() `tout le temps.

+0

La première version (avec 'while') peut avoir un problème quand' root == NULL'. – Arun

1

Essayez:

void traverse(Node* root) 
{ 
    queue<Node*> q; 
    q.push(root); 

    while(!q.empty()) 
    { 
     Node* temp_node = q.front(); 
     q.pop(); 
     if (temp_node == NULL) 
     { continue; 
     } 

     cout << temp_node->value << endl; 

     q.push(temp_node->left); 
     q.push(temp_node->right); 
    } 
} 
2

Un sérieux problème avec votre code existant est-il se bloque quand il est appelé sur un arbre vide (root = NULL).

Vous devez décider si vous souhaitez avoir des pointeurs NULL dans la file d'attente ou non.

Si ce n'est pas le cas, vous ne pouvez mettre en file d'attente que des valeurs non NULL.

void traverse(Node* root) { 
    queue<Node*> q; 

    // no tree no level order. 
    if(root == NULL) { 
     return; 
    } 

    // push the root to start with as we know it is not NULL. 
    q.push(root); 

    // loop till there are nodes in the queue. 
    while(!q.empty()) { 
     // dequeue the front node. 
     Node *tmpNode = q.front(); 
     q.pop(); 

     // print it..we are sure it is not NULL. 
     cout<<tmpNode->value<<" "; 

     // enqueue left child if it exists. 
     if(tmpNode->left) { 
      q.push(tmpNode->left); 
     } 
     // enqueue right child if it exists. 
     if(tmpNode->right) { 
      q.push(tmpNode->right); 
     } 
    } 
} 

Alternativement, si vous décidez d'avoir NULL dans la file d'attente que vous pouvez faire:

void traverse(Node* root) { 
    queue<Node*> q; 

    // push the root..even if it is NULL. 
    q.push(root); 

    // loop till the queue is not empty. 
    while(!q.empty()) { 
     // dequeue the front node. 
     Node *tmpNode = q.front(); 
     q.pop(); 

     // the dequeued pointer can be NULL or can point to a node. 
     // process the node only if it is not NULL.  
     if(tmpNode) {  
      cout<<tmpNode->value<<" "; 
      q.push(tmpNode->left); 
      q.push(tmpNode->right); 
     } 
    } 
} 

La première méthode est préférée comme un grand arbre a beaucoup de NULL enfants (enfants de nœuds feuilles) et il Cela ne sert à rien de les mettre en file d'attente lorsque nous ne les traitons pas plus tard.

1

Vous pouvez essayer cette façon:

struct Node 
{ 
    char data; 
    Node* left; 
    Node* right; 
}; 
void LevelOrder(Node* root) 
{ 
    if(root == NULL) return; 
    queue<Node*> Q; 
    Q.push(root); 
    while(!Q.empty()) 
    { 
     Node* current = Q.front(); 
     cout<< current->data << " "; 
     if(current->left != NULL) Q.push(current->left); 
     if(current->right != NULL) Q.push(current->right); 
     Q.pop(); 
    } 
} 
1

Je pense que des extraits de code ci-dessus permettent d'imprimer l'ordre de niveau traversal en format tableau. Ce code peut aider à écrire la solution sous forme d'ordre de niveau.

vector<vector<int>> levelOrder(TreeNode* root) { 
    vector<vector<int>> a ; 
    vector<int> b; 
    if (root == NULL) return a; 
    std::queue<TreeNode *> q; 
    q.push(root); 
    int nodeCount ; 
    TreeNode* temp; 
    while(true){ 
     nodeCount = q.size(); 
     if (nodeCount == 0) break; 
     while(!nodeCount){ 
      temp = q.front(); 
      b.push_back(temp->val); 
      q.pop(); 
      if(temp->left != NULL) q.push(temp->left); 
      if(temp->right!= NULL) q.push(temp->right); 
      nodeCount-- ; 
     } 
     a.push_back(b); 
     b.resize(0); 
    } 
    return a; 
} 

Sortie:

[ [1], 
    [2,3], 
    [4,5] 
] 
+1

Merci. Ça m'a aidé :) –

0

solution Java My utilisant la structure de données de file d'attente et de l'algorithme BFS:

void levelOrder(Node root) { 
     //LinkedList is class of Queue interface 
     Queue<Node> queue=new LinkedList<>(); 
     queue.add(root); 

     //Using BFS algorithm and queue used in BFS solution 
     while(!queue.isEmpty()) { 
       Node node=queue.poll(); 
       System.out.print(node.data+" "); 
       if(node.left!=null) 
       queue.add(node.left); 
       if(node.right!=null) 
       queue.add(node.right); 
       } 
    } 
Questions connexes