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

C++で再帰およびスタックなしのバイナリツリーのポストオーダートラバーサル


この問題では、二分木が与えられます。私たちのタスクは、再帰を使用せず、スタックを使用せずに、バイナリツリーのポストオーダートラバーサルを印刷することです。 。

二分木 は、各ノードが最大2つの子ノードを持つことができる特殊なタイプのツリーです。

C++で再帰およびスタックなしのバイナリツリーのポストオーダートラバーサル

ポストオーダートラバーサル はツリートラバーサル手法であり、最初の左のサブツリーが右のサブツリーよりもトラバースされ、ルートが最後にトラバースされます。

上記のツリーのポストオーダートラバーサル-84 2 7 9 6

再帰とスタックを使用せずにツリーをトラバースします。深さ優先探索ベースの手法を使用し、データはハッシュテーブルに保存されます。 。

このソリューションの実装を示すプログラム

#include <bits/stdc++.h>
using namespace std;
struct Node {
   int data;
   struct Node *left, *right;
};
void postOrderTraversal(struct Node* head) {
   struct Node* temp = head;
   unordered_set<Node*> visited;
   while (temp && visited.find(temp) == visited.end()) {
      if (temp->left &&
         visited.find(temp->left) == visited.end())
         temp = temp->left;
      else if (temp->right &&
         visited.find(temp->right) == visited.end())
         temp = temp->right;
      else {
         cout<<temp->data<<"\t";
         visited.insert(temp);
         temp = head;
      }
   }
}
struct Node* insertNode(int data){
   struct Node* node = new Node;
   node->data = data;
   node->left = NULL;
   node->right = NULL;
   return (node);
}
int main(){
   struct Node* root = insertNode(6);
   root->left = insertNode(2);
   root->right = insertNode(9);
   root->left->left = insertNode(8);
   root->left->right = insertNode(4);
   root->right->left = insertNode(7);
   root->right->left->left = insertNode(13);
   cout<<"Post Order Traversal of the binary tree :\n";
   postOrderTraversal(root);
   return 0;
}

出力

Post Order Traversal of the binary tree :
8    4    2    13    7    9    6

同じソリューションを更新して、ハッシュテーブルの使用をなくすことができます。その仕事は訪問したノードを保存することです。システムの負荷を軽減するために、ツリー自体のすべてのノードに訪問済みフラグを追加します。これにより、アルゴリズムが改善されます。

より効果的な解決策は、順序付けられていないマップを使用することです。これにより、ヘッドへのトラックバックのオーバーヘッドが削減されます。

実装を示すプログラム

#include <bits/stdc++.h>
using namespace std;
struct Node {
   int data;
   struct Node *left, *right;
   bool visited;
};
void postOrderTraversal(Node* root) {
   Node* n = root;
   unordered_map<Node*, Node*> postorder;
   postorder.insert(pair<Node*, Node*>(root, nullptr));
   while (n) {
      if (n->left && postorder.find(n->left) == postorder.end()) {
         postorder.insert(pair<Node*, Node*>(n->left, n));
         n = n->left;
      }
      else if (n->right && postorder.find(n->right) == postorder.end()) {
         postorder.insert(pair<Node*, Node*>(n->right, n));
         n = n->right;
      }
      else {
         cout<<n->data<<"\t";
         n = (postorder.find(n))->second;
      }
   }
}
struct Node* insertNode(int data) {
   struct Node* node = new Node;
   node->data = data;
   node->left = NULL;
   node->right = NULL;
   node->visited = false;
   return (node);
}
int main() {
   struct Node* root = insertNode(6);
   root->left = insertNode(2);
   root->right = insertNode(9);
   root->left->left = insertNode(8);
   root->left->right = insertNode(4);
   root->right->left = insertNode(7);
   root->right->left->left = insertNode(13);
   cout<<"Post Order Traversal of the binary tree :\n";
   postOrderTraversal(root);
   return 0;
}

出力

Post Order Traversal of the binary tree :
8    4    2    13    7    9    6

  1. 与えられた二分木のポストオーダー再帰トラバーサルを実行するC++プログラム

    ツリートラバーサルは、グラフトラバーサルの一種です。これには、ツリー内の各ノードを1回だけチェックまたは印刷することが含まれます。二分探索木のポストオーダートラバーサルでは、ツリー内の各ノードに順番に(左、右、ルート)アクセスします。 二分木のポストオーダートラバーサルの例は次のとおりです。 二分木は次のように与えられます。 注文後のトラバーサルは次のとおりです:1 5 4 8 6 注文後の再帰的走査を実行するプログラムは次のとおりです。 例 #include<iostream> using namespace std; struct node {   &

  2. Pythonでの二分木ポストオーダートラバーサル

    二分木があるとします。反復アプローチを使用して、このツリーのポストオーダートラバーサルを見つける必要があります。したがって、ツリーが次のような場合- その場合、出力は次のようになります:[9,15,7,10、-10] これを解決するには、次の手順に従います- ルートがnullの場合、空の配列を返します 配列を作成するret stack:=ペア[root、0]でスタックを定義します スタックが空でない間- node:=スタックの一番上にあり、スタックから要素を削除します。 ノードペアの2番目の値が0の場合、 current:=ノードペアの最初