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

【C++】二分木の中間順走査でN番目のノードを検索する方法

この記事では、二分木(バイナリツリー)と整数Nが与えられたときに、二分木を中間順走査(inorder traversal)した際のN番目のノードを見つける方法を解説します。

二分木とは、各ノードが最大2つまでの子ノードを持つことができる特殊な木構造データです。

走査(トラバーサル)とは、木構造に含まれるすべてのノードを訪問する処理のことで、訪問時に各ノードの値を出力することもできます。

それでは、具体的な例を使ってこの問題を理解していきましょう。

入力例

N = 6

【C++】二分木の中間順走査でN番目のノードを検索する方法

出力例

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
  1. C++で実装するN分木の先行順走査(プレオーダートラバーサル)

    N分木(n-ary tree)が与えられたとき、そのノードの値を先行順走査(プレオーダートラバーサル)で訪問した結果を求める問題を考えてみましょう。例として、次のような木が入力された場合を考えます。この場合の出力は [1, 3, 5, 6, 2, 4] となります。解き方のアプローチこの問題は、再帰を使うことでシンプルに解くことができます。手順は以下の通りです。結果を格納するための配列 ans を用意しますroot を引数に取る preorder() メソッドを定義しますroot が null(空)である場合は、空のリストを返しますroot の値を ans の末尾に追加しますroot の ch

  2. C++で二分木の垂直順走査におけるK番目のノードを求める方法

    二分木と値Kが与えられたとき、垂直順走査(Vertical Order Traversal)におけるK番目のノードを出力するのが課題です。該当するノードが存在しない場合は-1を返します。例として、次のような二分木を考えてみましょう。この二分木を垂直順に走査すると、結果は以下のようになります。4 2 1 5 6 3 8 7 9つまり、K = 3 の場合、答えは 1 となります。アプローチの解説考え方は非常にシンプルです。まず垂直順走査を実行し、走査中の現在のノードがK番目のノードかどうかを順番に確認していきます。K番目に到達した時点で、そのノードの値を返します。垂直順走査では、各ノードに水平距離