C++で二分木のすべての葉ノードの積を求める方法
ノードから構成される二分木が与えられたとき、その二分木に含まれるすべての葉ノードの値の積を求めるのが本記事のテーマです。
葉ノードとは、子ノードを持たない末端のノードのことを指します。木構造では、ルートノード以外の各ノードは親ノードにも子ノードにもなり得ますが、ルートノードは親としてのみ存在します。つまり、左ポインタと右ポインタがどちらもNULLになっているノードこそが葉ノードだと判定できます。
入力

出力
葉ノード -: 23, 34, 25 積 -: 23 × 34 × 25 = 19550
アプローチ
- ノードのデータを入力する
- ルートノードから出発し、左部分木または右部分木へ再帰的に降りながら全ノードを走査する
- 左右のポインタがともにNULLであるノード(=葉ノード)を検出したら、その値を積算用の変数に掛けていく
- 積を保持している変数の値を出力する
アルゴリズム
開始
ステップ 1 → ノードの構造体を定義する
struct node
int data
node *left, *right
終了
ステップ 2 → 木に新しいノードを挿入する関数を宣言する
node* new_node(int data)
node* temp = new node()
temp→data = data
temp→left = temp→right = NULL
return temp
終了
ステップ 3 → すべての葉ノードの積を求める関数を宣言する
void leaf(node* root, int &product)
IF (!root)
Return
IF (!root→left && !root→right)
product *= root→data
leaf(root→left, product) を呼び出す
leaf(root→right, product) を呼び出す
ステップ 4 → main() 内で
node* root = new_node(10) を生成
root→left = new_node(20) を設定
root→left→left = new_node(30) を設定
int product = 1 を設定
leaf(root, product) を呼び出す
product を表示
終了
実装例
#include <bits/stdc++.h>
using namespace std;
// ノードの構造体
struct node {
int data;
node *left, *right;
};
// 木の新しいノードを生成する関数
node* new_node(int data) {
node* temp = new node();
temp->data = data;
temp->left = temp->right = NULL;
return temp;
}
// 木のすべての葉ノードの積を求める関数
void leaf(node* root, int &product) {
if (!root)
return;
// 左右どちらの子も持たないノードが葉ノード
if (!root->left && !root->right)
product *= root->data;
leaf(root->left, product);
leaf(root->right, product);
}
int main() {
node* root = new_node(10);
root->left = new_node(20);
root->left->left = new_node(30);
root->left->right = new_node(40);
root->right = new_node(50);
root->right->right = new_node(60);
root->right->left = new_node(70);
int product = 1;
leaf(root, product);
cout << "product of a leaf nodes are :" << product;
return 0;
}
出力
上記のコードを実行すると、次の出力が得られます。
product of a leaf nodes are :5040000
この例では、葉ノードは 30、40、60、70 の4つであり、30 × 40 × 60 × 70 = 5,040,000 となるため、再帰的な走査によってすべての葉ノードの積が正しく計算できていることが確認できます。
-
C++で完全二分木の全ノードの合計を効率的に求める方法
問題の概要 正整数 L が与えられ、これは完全二分木(パーフェクト・バイナリツリー)のレベル数を表しているとします。この木の葉ノードには、1 から n までの番号が順に割り当てられています(n は葉ノードの総数)。また、各親ノードの値は、その 2 つの子ノードの値の合計となります。 今回の課題は、この完全二分木に含まれるすべてのノードの値の合計を出力するプログラムを作成することです。 例として、次のような木を考えてみましょう。 この木の場合、すべてのノードの合計は 30 になります。 解法のアプローチ この問題を注意深く観察すると、求めるべきは全ノードの値の総和です。葉ノードには 1 から
-
C++で二分木のすべてのノードのレベルを出力する方法
二分木(バイナリツリー)が与えられたとき、各ノードに格納されたすべてのキーについて、そのノードが属するレベル(根をレベル1として数える)を出力するのが本記事の目的です。上記の木では、ノードは次のように配置されています。10 はレベル 1 3 と 211 はレベル 2 140、162、100、146 はレベル 3特定のキーが与えられた場合、プログラムはそのキーが属するレベルを出力できなければなりません。入出力例入力: 10 3 211 140 162 100 146 出力: 10 のレベルは 1 3