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

C++で二分木のすべてのノードのレベルを出力する方法

二分木(バイナリツリー)が与えられたとき、各ノードに格納されたすべてのキーについて、そのノードが属するレベル(根をレベル1として数える)を出力するのが本記事の目的です。

C++で二分木のすべてのノードのレベルを出力する方法

上記の木では、ノードは次のように配置されています。

10 はレベル 1
3 と 211 はレベル 2
140、162、100、146 はレベル 3

特定のキーが与えられた場合、プログラムはそのキーが属するレベルを出力できなければなりません。

入出力例

入力: 10 3 211 140 162 100 146
出力:
    10 のレベルは 1
    3 のレベルは 2
    211 のレベルは 2
    140 のレベルは 3
    162 のレベルは 3
    100 のレベルは 3
    146 のレベルは 3

アプローチのポイント

この問題は、幅優先探索(BFS/レベル順走査)を利用することで効率的に解けます。キューには「ノードへのポインタ」と「そのノードのレベル」をペアで格納し、ノードを取り出すたびに子ノードへは現在のレベル+1を設定して追加していきます。こうすることで、すべてのノードのレベルを一度の走査で求められます。計算量はノード数を n とすると O(n) です。

アルゴリズム

START
Step 1 -> ノードの構造体を作成する
    struct node
        struct node *left, *right
        int data
    End
Step 2 -> ノードを生成する関数
    node* newnode(int data)
    node *temp = new node
    temp->data = data
    temp->left = temp->right = NULL
    return temp
Step 3 -> 各ノードのレベルを求める関数を作成する
    void levels(Node* root)
        IF root == NULL
        Return
    End
    STL の queue<pair<struct Node*, int> > que を作成
    que.push({root, 1})
    STL の pair<struct Node*, int> par を作成
    Loop While !que.empty()
        par = que.front()
        que.pop()
        par.first->data と par.second を出力
        IF par.first->left
            que.push({ par.first->left, par.second + 1 })
        END
        IF par.first->right
            que.push({ par.first->right, par.second + 1 })
        End
    End
STOP

C++による実装例

#include <bits/stdc++.h>
using namespace std;
// ノードの構造体
struct Node{
    int data;
    struct Node *left, *right;
};
// 木の各ノードのレベルを出力する関数
void levels(Node* root){
    if (root==NULL)
        return;
    queue<pair<struct Node*, int> >que;
    que.push({root, 1});
    pair<struct Node*, int> par;
    while (!que.empty()) {
        par = que.front();
        que.pop();
        cout << "Level of " << par.first->data << " is " << par.second << "\n";
        if (par.first->left)
            que.push({ par.first->left, par.second + 1 });
        if (par.first->right)
            que.push({ par.first->right, par.second + 1 });
    }
}
// ノードを生成して木を組み立てる関数
Node* newnode(int data){
    Node* temp = new Node;
    temp->data = data;
    temp->left = temp->right = NULL;
    return temp;
}
int main(){
    Node* root = NULL;
    // ノードを作成する
    root = newnode(34);
    root->left = newnode(12);
    root->right = newnode(50);
    root->left->left = newnode(11);
    root->left->right = newnode(54);
    levels(root);
    return 0;
}

出力

上記のプログラムを実行すると、次のような出力が得られます。

Level of 34 is 1
Level of 12 is 2
Level of 50 is 2
Level of 11 is 3
Level of 54 is 3
  1. 【C++】二分木内の任意の2つのノード間のパスを出力する方法

    はじめに 本記事では、C++プログラミングにおいて二分木(バイナリツリー)内の任意の2つのノード間のパス(経路)を出力する方法を解説します。 前提として、すべてのノードが互いに異なる値を持つ二分木が与えられ、その中から指定した2つのノードをつなぐ経路を出力することを目標とします。 例として、次のような二分木を考えます。 具体例: ノード140からノード211までの経路を出力したい場合、期待される出力は以下の通りです。 Output: 140->3->10->211 解決のアプローチ 基本的なアイデアは、「ルートノードから目的の2つのノードそれぞれへの経路」を求め、それらを

  2. C++で二分木の奇数レベルにあるノードを出力する方法

    はじめに二分木が与えられたとき、プログラムは木の奇数レベルにあるノードを出力する必要があります。ここでいうレベルとは、二分木の階層を表し、ルートをレベル1として1からnまで数えます。実装方法については特に指定がないため、再帰または反復のどちらかのアプローチを選択できます。本記事では、コードが簡潔になる再帰的なアプローチを採用します。プログラムは関数を再帰的に呼び出し、その関数が奇数レベルのノードを取得して出力します。上記の二分木の場合 −レベル1のノード: 10 レベル2のノード: 3 と 211 レベル3のノード: 140、162、100、146この木では、レベル1とレベル3が奇数レベルに該