C++で二分木の右側の葉(右葉)の合計を求める方法
二分木が与えられたとき、その木に含まれるすべての「右葉(右側につながった葉ノード)」の値の合計を求める問題を考えてみましょう。
例えば、次のような二分木が入力として与えられた場合を考えます。

この場合の出力は 17 になります。この二分木には値が 7 と 10 の2つの右葉が存在するためです。
解決のためのアプローチ
この問題は、DFS(深さ優先探索)を利用することで効率的に解くことができます。手順は以下の通りです。
- dfs() 関数を定義します。引数としてノード(node)とブール値のフラグ(add)を受け取ります。
- node が null の場合は、何もせずに処理を終了して戻ります。
- node の左の子・右の子がどちらも存在しない(=葉ノードである)、かつ add が true の場合、ret にそのノードの値を加算します。
- dfs(node->left, false) を呼び出します。左側の子孫は右葉にならないためです。
- dfs(node->right, true) を呼び出します。右側の子孫は右葉の候補になるためです。
メインとなる solve メソッドでは、以下の処理を行います。
- ret を 0 で初期化します。
- dfs(root, true) を呼び出します。
- 最後に ret を返します。
それでは、理解を深めるために実際の実装例を見てみましょう。
C++での実装例
#include <bits/stdc++.h>
using namespace std;
class TreeNode{
public:
int val;
TreeNode *left, *right;
TreeNode(int data){
val = data;
left = NULL;
right = NULL;
}
};
class Solution {
public:
int ret = 0;
void dfs(TreeNode* node, bool add){
if(!node)
return;
if(!node->left && !node->right && add){
ret += node->val;
}
dfs(node->left, false);
dfs(node->right, true);
}
int solve(TreeNode* root) {
ret = 0;
dfs(root, true);
return ret;
}
};
int main(){
Solution ob;
TreeNode *root = new TreeNode(3);
root->left = new TreeNode(9);
root->right = new TreeNode(10);
root->left->left = new TreeNode(15);
root->left->right = new TreeNode(7);
cout << (ob.solve(root));
return 0;
}
入力
TreeNode *root = new TreeNode(3); root->left = new TreeNode(9); root->right = new TreeNode(10); root->left->left = new TreeNode(15); root->left->right = new TreeNode(7);
出力
17
-
C++で完全二分木の全ノードの合計を効率的に求める方法
問題の概要 正整数 L が与えられ、これは完全二分木(パーフェクト・バイナリツリー)のレベル数を表しているとします。この木の葉ノードには、1 から n までの番号が順に割り当てられています(n は葉ノードの総数)。また、各親ノードの値は、その 2 つの子ノードの値の合計となります。 今回の課題は、この完全二分木に含まれるすべてのノードの値の合計を出力するプログラムを作成することです。 例として、次のような木を考えてみましょう。 この木の場合、すべてのノードの合計は 30 になります。 解法のアプローチ この問題を注意深く観察すると、求めるべきは全ノードの値の総和です。葉ノードには 1 から
-
Pythonで二分木の指定ノードの右隣ノードを見つけるプログラム
二分木が与えられ、さらに特定のノード「u」へのポインタも渡されたとします。このとき、u のすぐ右側に位置するノード(必ず同じ階層に存在する)を見つける必要があります。対象のノードは葉ノードの場合もあれば、内部ノードの場合もあります。 例として、次のような二分木が入力されたとしましょう。 ここで u = 6 とすると、出力は 8 になります。ノード 6 の右隣にはノード 8 が存在するため、値 8 が返されるというわけです。 解決のためのアプローチ この問題は、両端キュー(deque)を使った幅優先探索(BFS)、いわゆるレベル順走査によって解くことができます。手順は以下の通りです。 ルー