C++で木の中から重みの桁和が奇数となるノードを数える方法
各ノードに重みが割り当てられた二分木が与えられます。この問題の目標は、重みの各桁の合計(桁和)が奇数になるノードの個数を求めることです。たとえば、重みが「12」であれば桁和は 1+2=3 となり奇数なので、このノードはカウントの対象になります。
例
入力
入力された値から作成される木は次のとおりです。

出力
与えられた木のうち、重みの桁和が奇数であるノードの数:2
説明
木の各ノードと、それぞれに対応する重みが与えられています。 すべての重みについて桁和を計算し、それが奇数かどうかを判定します。
| ノード | 重み | 桁和 | 奇数? |
|---|---|---|---|
| 2 | 23 | 2+3=5 | はい |
| 1 | 141 | 1+4+1=6 | いいえ |
| 4 | 211 | 2+1+1=4 | いいえ |
| 3 | 133 | 1+3+3=7 | はい |
| 8 | 7171 | 7+1+7+1=16 | いいえ |
| 9 | 101 | 1+0+1=2 | いいえ |
入力
入力された値から作成される木は次のとおりです。

出力
与えられた木のうち、重みの桁和が奇数であるノードの数:4
説明
木の各ノードと、それぞれに対応する重みが与えられています。 すべての重みについて桁和を計算し、それが奇数かどうかを判定します。
| ノード | 重み | 桁和 | 奇数? |
|---|---|---|---|
| 2 | 5 | 5 | はい |
| 1 | 141 | 1+4+1=6 | いいえ |
| 4 | 41 | 4+1=5 | はい |
| 3 | 322 | 3+2+2=7 | はい |
| 8 | 717 | 7+1+7=15 | はい |
以下のプログラムで採用しているアプローチは次のとおりです。
このアプローチでは、木に対してDFS(深さ優先探索)を適用して走査を行い、各ノードの重みの桁和が奇数かどうかを確認します。そのために、Node_Weight(100) と edge_graph[100] という2つのベクターを用意します。
- Node_Weight[] を各ノードの重みで初期化します。
- ベクター edge_graph を使って木(グラフ)を構築します。
- グローバル変数 sum を宣言し、0 で初期化します。
- 関数 sum_total(int check) は整数を受け取り、その桁和を返します。
- 初期値として total=0 を設定します。
- while ループの中で、check % 10 によって最下位の桁を取り出して total に加算し、check を 10 で割りながら更新していきます。
- check の桁和である total を返します。
- 関数 odd_weight(int node, int root) はノードとその親ノードを受け取り、重みの桁和が奇数であるノードの数を返します。
- total = sum_total(Node_Weight[node]) として、そのノードの重みの桁和を計算します。
- total % 2 == 1 であれば奇数なので、sum をインクリメントします。
- 隣接リスト内の次のノードに対して odd_weight(it, node) を再帰的に呼び出します。
- すべての処理が完了した時点で、sum には重みの桁和が奇数となるノードの総数が格納されます。
例
#include <bits/stdc++.h>
using namespace std;
vector<int> Node_Weight(100);
vector<int> edge_graph[100];
int sum = 0;
int sum_total(int check){
int total = 0;
while(check){
total += check % 10;
check = check / 10;
}
return total;
}
void odd_weight(int node, int root){
int total = sum_total(Node_Weight[node]);
if (total % 2 == 1){
sum++;
}
for (int it : edge_graph[node]){
if(it == root){
continue;
}
odd_weight(it, node);
}
}
int main(){
//ノードの重み
Node_Weight[2] = 23;
Node_Weight[1] = 141;
Node_Weight[4] = 211;
Node_Weight[3] = 115;
Node_Weight[8] = 7171;
Node_Weight[9] = 701;
//グラフの辺を作成
edge_graph[2].push_back(1);
edge_graph[2].push_back(4);
edge_graph[4].push_back(3);
edge_graph[4].push_back(8);
edge_graph[8].push_back(9);
odd_weight(2, 2);
cout<<"与えられた木のうち、重みの桁和が奇数であるノードの数:"<<sum;
return 0;
}出力
上記のコードを実行すると、次の出力が得られます。
与えられた木のうち、重みの桁和が奇数であるノードの数:2
-
C++で二分木の奇数レベルにあるノードを出力するプログラム
このチュートリアルでは、与えられた二分木(バイナリツリー)の中から、奇数レベルに存在するノードを出力するC++プログラムについて解説します。 本プログラムでは、ルートノードのレベルを「1」と定義し、それ以降のレベルは交互にカウントしていきます。つまり、レベル1・3・5…といった奇数番目の階層に属するノードが出力の対象となります。 例として、以下のような二分木が与えられた場合を考えてみましょう。 この二分木の場合、奇数レベルに存在するノードは 1, 4, 5, 6 となります。 アルゴリズムの考え方 実装には再帰呼び出しを利用します。ルートから探索を開始し、現在のレベルが奇数かどうかをブール
-
C++で二分木の奇数レベルにあるノードを出力する方法
はじめに二分木が与えられたとき、プログラムは木の奇数レベルにあるノードを出力する必要があります。ここでいうレベルとは、二分木の階層を表し、ルートをレベル1として1からnまで数えます。実装方法については特に指定がないため、再帰または反復のどちらかのアプローチを選択できます。本記事では、コードが簡潔になる再帰的なアプローチを採用します。プログラムは関数を再帰的に呼び出し、その関数が奇数レベルのノードを取得して出力します。上記の二分木の場合 −レベル1のノード: 10 レベル2のノード: 3 と 211 レベル3のノード: 140、162、100、146この木では、レベル1とレベル3が奇数レベルに該