C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++で二分木の右側の葉(右葉)の合計を求める方法

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

例えば、次のような二分木が入力として与えられた場合を考えます。

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
  1. C++で完全二分木の全ノードの合計を効率的に求める方法

    問題の概要 正整数 L が与えられ、これは完全二分木(パーフェクト・バイナリツリー)のレベル数を表しているとします。この木の葉ノードには、1 から n までの番号が順に割り当てられています(n は葉ノードの総数)。また、各親ノードの値は、その 2 つの子ノードの値の合計となります。 今回の課題は、この完全二分木に含まれるすべてのノードの値の合計を出力するプログラムを作成することです。 例として、次のような木を考えてみましょう。 この木の場合、すべてのノードの合計は 30 になります。 解法のアプローチ この問題を注意深く観察すると、求めるべきは全ノードの値の総和です。葉ノードには 1 から

  2. Pythonで二分木の指定ノードの右隣ノードを見つけるプログラム

    二分木が与えられ、さらに特定のノード「u」へのポインタも渡されたとします。このとき、u のすぐ右側に位置するノード(必ず同じ階層に存在する)を見つける必要があります。対象のノードは葉ノードの場合もあれば、内部ノードの場合もあります。 例として、次のような二分木が入力されたとしましょう。 ここで u = 6 とすると、出力は 8 になります。ノード 6 の右隣にはノード 8 が存在するため、値 8 が返されるというわけです。 解決のためのアプローチ この問題は、両端キュー(deque)を使った幅優先探索(BFS)、いわゆるレベル順走査によって解くことができます。手順は以下の通りです。 ルー