C++で二分木のすべての完全ノード(フルノード)を出力する方法
この記事では、二分木が与えられたときに、その木に含まれるすべての完全ノード(フルノード)を見つけて出力する方法を解説します。
二分木と完全ノードとは?
二分木(バイナリツリー)とは、各ノードが最大2つの子ノードを持つことができる木構造のことです。子ノードは0個(葉)、1個、または2個のいずれかになります。
完全ノード(フルノード)とは、左の子と右の子の両方を持っているノードのことを指します。言い換えれば、左右どちらか一方しか子を持たないノードや、子をまったく持たないノードは完全ノードではありません。
具体例
次のような二分木を考えてみましょう。
100
/ \
56 12
/ / \
89 32 45
この場合、左と右の両方の子を持つノードは 100 と 12 の2つです。したがって、出力結果は次のようになります。
出力: 100 12
解決アプローチ
この問題は非常にシンプルな方法で解くことができます。手順は以下の通りです。
- 任意の走査アルゴリズム(ここでは中順走査:inorder traversal)を使って木を巡回します。
- 現在のノードが左の子と右の子の両方を持っているかどうかを確認します。
- 両方の子を持っている場合は、そのノードの値を出力します。持っていない場合は何もしません。
この処理を再帰的に行うことで、木の中のすべての完全ノードを効率よく見つけることができます。
C++による実装例
以下は、上記のアプローチを実装したC++プログラムです。
#include <iostream>
using namespace std;
struct Node {
int data;
struct Node *left, *right;
};
// 新しいノードを作成する関数
Node* insertNode(int data) {
Node* temp = new Node;
temp->data = data;
temp->left = temp->right = NULL;
return temp;
}
// 完全ノードを出力する関数(中順走査)
void printFullNode(Node* root) {
if (root != NULL) {
printFullNode(root->left);
if (root->left != NULL && root->right != NULL)
cout << root->data << "\t";
printFullNode(root->right);
}
}
int main() {
Node* root = insertNode(100);
root->left = insertNode(56);
root->right = insertNode(12);
root->left->left = insertNode(89);
root->right->left = insertNode(32);
root->right->right = insertNode(45);
cout << "木のすべての完全ノード :\n";
printFullNode(root);
return 0;
}
実行結果
木のすべての完全ノード : 100 12
計算量について
このアルゴリズムは木のすべてのノードを一度だけ訪問するため、時間計算量は O(n)(nはノード数)となります。また、再帰呼び出しによるスタック領域が必要で、空間計算量は木の高さに依存し、最悪の場合(偏った木)で O(n)、バランスの取れた木では O(log n) となります。
-
C++で二分木のノードを葉ノードになった順に出力する方法
問題概要 二分木が与えられたとき、まずその葉ノード(リーフノード)を出力します。次に、出力した葉ノードを木から取り除き、新たに葉ノードとなったノードを出力します。この操作を、木の中にノードが一つも残らなくなるまで繰り返します。 例 以下のような二分木を例に考えてみましょう。 まず最下層の葉ノード「6 7 9 13 14」を出力して取り除き、次に新たな葉ノードとなった「3 4」を出力、続いて「2」、最後に根ノード「1」を出力します。したがって、この問題の出力は以下のようになります。 6 7 9 13 14 3 4 2 1 アプローチ この問題では、DFS(深さ優先探索)を用いたアプロ
-
C++で二分木のすべてのノードのレベルを出力する方法
二分木(バイナリツリー)が与えられたとき、各ノードに格納されたすべてのキーについて、そのノードが属するレベル(根をレベル1として数える)を出力するのが本記事の目的です。上記の木では、ノードは次のように配置されています。10 はレベル 1 3 と 211 はレベル 2 140、162、100、146 はレベル 3特定のキーが与えられた場合、プログラムはそのキーが属するレベルを出力できなければなりません。入出力例入力: 10 3 211 140 162 100 146 出力: 10 のレベルは 1 3