C++の反復アプローチで二分木の全リーフノードを左から右へ出力する方法
この記事では、二分木が与えられたときに、そのすべての葉ノード(リーフノード)を左から右の順に出力する方法を解説します。
問題の理解
まず、具体例を使って問題を確認しましょう。
入力 −

出力 − 1 4 7
上図の二分木では、子を持たないノードである「1」「4」「7」が葉ノードに該当し、左から右の順に出力されます。
解決アプローチ
この問題を反復的なアプローチで解くには、深さ優先探索(DFS)を利用します。木の走査は根ノードから開始し、各ノードに対して以下の手順を実行します。
- そのノードが葉ノード(左右どちらの子も持たないノード)であれば、データを出力します。
- 葉ノードでない場合は、まず左の子部分木、次に右の子部分木の順で走査を続けます。
左側の部分木を先に処理することで、すべての葉ノードが自然に左から右の順序で出力されます。
実装例
以下のコードは、この解法を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 printLTRLeafNodes(Node *root){
if (!root)
return;
if (!root->left && !root->right) {
cout<<root->data<<"\t";
return;
}
if (root->left)
printLTRLeafNodes(root->left);
if (root->right)
printLTRLeafNodes(root->right);
}
int main(){
Node *root = insertNode(21);
root->left = insertNode(5);
root->right = insertNode(36);
root->left->left = insertNode(2);
root->right->left = insertNode(13);
root->right->right = insertNode(4);
root->right->left->left = insertNode(76);
root->right->left->right = insertNode(9);
root->right->right->left = insertNode(17);
root->right->right->right = insertNode(2);
cout<<"Leaf Nodes of the tree from left to right are :\n";
printLTRLeafNodes(root);
return 0;
}
出力結果
Leaf Nodes of the tree from left to right are − 2 76 9 17 2
このように、DFSによる走査を利用すれば、二分木のすべての葉ノードを簡単に左から右の順序で出力できます。
-
C++で二分木のすべてのノードのレベルを出力する方法
二分木(バイナリツリー)が与えられたとき、各ノードに格納されたすべてのキーについて、そのノードが属するレベル(根をレベル1として数える)を出力するのが本記事の目的です。上記の木では、ノードは次のように配置されています。10 はレベル 1 3 と 211 はレベル 2 140、162、100、146 はレベル 3特定のキーが与えられた場合、プログラムはそのキーが属するレベルを出力できなければなりません。入出力例入力: 10 3 211 140 162 100 146 出力: 10 のレベルは 1 3
-
C++でスタックを1つだけ使って二分木の葉ノードを左から右へ出力する方法
本記事では、二分木の葉ノードを左から右の順で出力するプログラムを紹介します。ここでのポイントは、スタックを1つだけしか使えないという制約です。push() 操作で二分木のノードをスタックに挿入し、pop() 操作で葉ノードを取り出して表示します。葉ノードとは?葉ノード(リーフノード)とは、左ポインタと右ポインタがどちらも NULL になっている、木の末端にあるノードのことです。つまり、そのノードは親ノードではないことを意味します。実行例入力 : 12 21 32 41 59 33 70 出力 : 41 59 33 70上記の例では、値が 41、59、33、70 のノードが葉ノードに該当します。