【C++】二分木の中間順走査でN番目のノードを検索する方法
この記事では、二分木(バイナリツリー)と整数Nが与えられたときに、二分木を中間順走査(inorder traversal)した際のN番目のノードを見つける方法を解説します。
二分木とは、各ノードが最大2つまでの子ノードを持つことができる特殊な木構造データです。
走査(トラバーサル)とは、木構造に含まれるすべてのノードを訪問する処理のことで、訪問時に各ノードの値を出力することもできます。
それでは、具体的な例を使ってこの問題を理解していきましょう。
入力例
N = 6

出力例
3
説明
木の中間順走査の結果:4, 2, 5, 1, 6, 3, 7
上記の走査結果において6番目に訪問されるノードは「3」であるため、出力は3となります。
解決アプローチ
この問題を解く鍵となるのは、再帰呼び出しを利用した二分木の中間順走査です。各再帰呼び出しでは、まず左部分木に対してfindInOrderTraversalRec()を呼び出し、次にルートノードを訪問した後、右部分木に対して同じ関数を呼び出します。
この走査の過程で訪問したノードの数をカウントしていき、カウントがNに一致したタイミングでそのノードの値を出力すれば、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<<"番目のノード(中間順走査)は ";
findInOrderTraversalRec(root, N);
return 0;
}
出力
6番目のノード(中間順走査)は 3
-
C++で実装するN分木の先行順走査(プレオーダートラバーサル)
N分木(n-ary tree)が与えられたとき、そのノードの値を先行順走査(プレオーダートラバーサル)で訪問した結果を求める問題を考えてみましょう。例として、次のような木が入力された場合を考えます。この場合の出力は [1, 3, 5, 6, 2, 4] となります。解き方のアプローチこの問題は、再帰を使うことでシンプルに解くことができます。手順は以下の通りです。結果を格納するための配列 ans を用意しますroot を引数に取る preorder() メソッドを定義しますroot が null(空)である場合は、空のリストを返しますroot の値を ans の末尾に追加しますroot の ch
-
C++で二分木の垂直順走査におけるK番目のノードを求める方法
二分木と値Kが与えられたとき、垂直順走査(Vertical Order Traversal)におけるK番目のノードを出力するのが課題です。該当するノードが存在しない場合は-1を返します。例として、次のような二分木を考えてみましょう。この二分木を垂直順に走査すると、結果は以下のようになります。4 2 1 5 6 3 8 7 9つまり、K = 3 の場合、答えは 1 となります。アプローチの解説考え方は非常にシンプルです。まず垂直順走査を実行し、走査中の現在のノードがK番目のノードかどうかを順番に確認していきます。K番目に到達した時点で、そのノードの値を返します。垂直順走査では、各ノードに水平距離