C++で順序トラバーサルのn番目のノードを検索します
この問題では、二分木と整数Nが与えられます。タスクは、二分木を順番に走査するn番目のノードを見つけることです。
二分木には、各ノードが最大2つの子を持つことができるという特別な条件があります。
トラバーサルは、ツリーのすべてのノードにアクセスするプロセスであり、それらの値も出力する場合があります。
問題を理解するために例を見てみましょう
入力
N = 6
出力
3
説明
inorder traversal of tree : 4, 2, 5, 1, 6, 3, 7
ソリューションアプローチ
アイデアは、再帰呼び出しを使用して実行されるバイナリツリーの順序どおりのトラバーサルを使用することです。各呼び出しでは、最初に左側のサブツリーに対してpreOrder()を呼び出し、ルートノードをトラバースしてからpreOrder()を呼び出します。このトラバーサル中に、ノードの数をカウントし、カウントがNであるノードを出力します。
ソリューションの動作を説明するプログラム
例
#include <iostream> using namespace std; struct Node { int data; Node *left, *right; }; struct Node* createNode(int item){ Node* temp = new Node; temp->data = item; temp->left = NULL; temp->right = NULL; return temp; } void findInOrderTraversalRec(struct Node* node, int N){ static int count = 0; if (node == NULL) return; if (count <= N) { findInOrderTraversalRec(node->left, N); count++; if (count == N) cout<<node->data; findInOrderTraversalRec(node->right, N); } } int main() { struct Node* root = createNode(1); root->left = createNode(2); root->right = createNode(3); root->left->left = createNode(4); root->left->right = createNode(5); root->right->left = createNode(6); root->right->right = createNode(7); int N = 6; cout<<N<<"th node in inorder traversal is "; findInOrderTraversalRec(root, N); return 0; }
出力
6th node in inorder traversal is 3
-
C++でのN-aryツリープレオーダートラバーサル
n-aryツリーが1つあるとすると、そのノードのプレオーダートラバーサルを見つける必要があります。 したがって、入力が次のような場合 その場合、出力は[1,3,5,6,2,4]になります。 これを解決するには、次の手順に従います- 配列を定義します preorder()というメソッドを定義します。これはルートになります ルートがnullの場合、- 空のリストを返す ansの最後にrootの値を挿入します ルートの子配列内のすべての子iについて preorder(i) ansを返す 例 理解を深めるために、次の実装を見てみ
-
C++で二分木の垂直方向の走査でk番目のノードを見つけます
二分木と値Kがあるとします。タスクは、垂直方向の走査でK番目のノードを出力することです。そのようなノードが存在しない場合は、-1を返します。したがって、ツリーが以下のようになっている場合- 垂直方向の走査は-のようなものです 4 2 1 5 6 3 8 7 9 したがって、K =3の場合、結果は1になります。 アプローチは簡単です。垂直方向の走査を実行し、現在のノードがk番目のノードであるかどうかを確認し、そうである場合は戻ります。 例 #include<iostream> #include<map> #include<vector> #incl