C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C++で単一のキューを使用したツリーのジグザグレベルの順序トラバーサル


この問題では、二分木が与えられます。私たちのタスクは、ツリーのジグザグレベルの順序トラバーサルを印刷することです。このトラバーサルでは、単一のキューのみを使用します。

問題を理解するために例を見てみましょう

C++で単一のキューを使用したツリーのジグザグレベルの順序トラバーサル

出力

3    1    7    2    8    9    5

単一のキューを使用してこの問題を解決するために、キューと方向フラグとともに追加の分離フラグを訴えます。

次に、ツリーをレベルごとにトラバースし、ルート要素を挿入します。次に、キューのすべての要素に対して、その子ノードをキューに挿入します。 NULLが検出された場合、方向を確認してから、指定された方向に要素をトラバースします。次に、最後のNULLにアクセスするまで挿入を続けます。

ソリューションを説明するプログラム

#include <bits/stdc++.h>
using namespace std;
struct Node {
   int data;
   struct Node *left, *right;
};
struct Node* insertNode(int data) {
   struct Node* node = new struct Node;
   node->data = data;
   node->left = node->right = NULL;
   return (node);
}
void zigZagTraversal(struct Node* root, int n){
   struct Node* queue[2 * n];
   int top = -1;
   int front = 1;
   queue[++top] = NULL;
   queue[++top] = root;
   queue[++top] = NULL;
   int prevFront = 0, count = 1;
   while (1) {
      struct Node* curr = queue[front];
      if (curr == NULL) {
         if (front == top)
            break;
         else {
            if (count % 2 == 0) {
               for (int i = prevFront + 1; i < front; i++)
                  cout<<queue[i]->data<<"\t";
            }
            else {
               for (int i = front - 1; i > prevFront; i--)
                  cout<<queue[i]->data<<"\t";
            }
            prevFront = front;
            count++;
            front++;
            queue[++top] = NULL;
            continue;
         }
      }
      if (curr->left != NULL)
         queue[++top] = curr->left;
      if (curr->right != NULL)
         queue[++top] = curr->right;
      front++;
   }
   if (count % 2 == 0) {
      for (int i = prevFront + 1; i < top; i++)
         cout<<queue[i]->data<<"\t";
   }
   else {
      for (int i = top - 1; i > prevFront; i--)
         cout<<queue[i]->data<<"\t";
   }
}
int main() {
   struct Node* root = insertNode(3);
   root->left = insertNode(1);
   root->right = insertNode(7);
   root->left->left = insertNode(5);
   root->left->right = insertNode(9);
   root->right->left = insertNode(8);
   root->right->right = insertNode(2);
   cout<<"Zig Zag traversal of the tree is :\n";
   zigZagTraversal(root, 7);
   return 0;
}

出力

Zig Zag traversal of the tree is :
3    1    7    2    8    9    5

  1. データ構造におけるレベル順序ツリートラバーサル

    このセクションでは、二分探索木のレベル順トラバーサル手法について説明します。 このようなツリーが1つあるとします- トラバーサルシーケンスは次のようになります:10、5、16、8、15、20、23 アルゴリズム levelOrderTraverse(root): Begin    define queue que to store nodes    insert root into the que.    while que is not empty, do       item := ite

  2. Pythonでの二分木ジグザグレベルの順序トラバーサル

    二分木があるとしましょう。ジグザグレベルの順序トラバーサルを見つける必要があります。したがって、最初の行については、左から右にスキャンし、次に2番目の行から右から左にスキャンし、次に再び左から右にスキャンします。したがって、ツリーが次のような場合- トラバーサルシーケンスは[[3]、[20,9]、[15,7]]になります これを解決するには、次の手順に従います- ツリーが空の場合は、空のリストを返します queue:=キューを作成し、ルートをキューに挿入し、2つの空のリストresとres2を作成し、フラグをTrueに設定します キューが空でない間 キュー