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

C++で二分木の最も深い葉ノードの値の合計を求める方法

はじめに

二分木(バイナリツリー)が与えられたとき、その中で最も深い位置にある葉ノード(deepest leaves)の値の合計を求めることを考えます。例えば、次のような二分木があるとします。

C++で二分木の最も深い葉ノードの値の合計を求める方法

この場合、最も深い葉ノードは 7 と 4 であり、出力は 11 になります。

解法のアプローチ

この問題は、深さ優先探索(DFS)を用いて各レベルごとのノードの値の合計を記録し、最後に最大深度に対応する合計を取得することで解けます。具体的には、以下の手順に従います。

  • レベルごとの合計を保持するマップ m と、最大深度を記録する変数 maxDepth を定義する
  • ノードとレベルを受け取る再帰メソッド solve() を定義する(レベルの初期値は 0)
  • ノードが存在しない場合は何もせずに処理を終了する
  • maxDepth を現在のレベルと既存の maxDepth の大きい方で更新する
  • m[level] に現在のノードの値を加算する
  • 左の子ノードに対して solve(node->left, level + 1) を呼び出す
  • 右の子ノードに対して solve(node->right, level + 1) を呼び出す
  • main 関数では maxDepth = 0 に初期化した上で solve(root, 0) を実行する
  • 最後に m[maxDepth] を返す

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 maxDepth;
   map <int, int> m;
   void solve(TreeNode* node, int level = 0){
      if(!node)return;
      maxDepth = max(level, maxDepth);
      m[level] += node->val;
      solve(node->left, level + 1);
      solve(node->right, level + 1);
   }
   int deepestLeavesSum(TreeNode* root) {
      maxDepth = 0;
      m.clear();
      solve(root);
      return m[maxDepth];
   }
};
main(){
   TreeNode *root = new TreeNode(1);
   root->left = new TreeNode(2);
   root->right = new TreeNode(3);
   root->left->left = new TreeNode(4);
   root->left->right = new TreeNode(5);
   root->right->right = new TreeNode(6);
   root->right->right->right = new TreeNode(4);
   root->left->left->left = new TreeNode(7);
   Solution ob;
   cout << (ob.deepestLeavesSum(root));
}

入力

TreeNode *root = new TreeNode(1);
root->left = new TreeNode(2);
root->right = new TreeNode(3);
root->left->left = new TreeNode(4);
root->left->right = new TreeNode(5);
root->right->right = new TreeNode(6);
root->right->right->right = new TreeNode(4);
root->left->left->left = new TreeNode(7);

出力

11

まとめ

このアルゴリズムでは、すべてのノードを一度だけ訪問するため、時間計算量は O(n)、マップが保持するエントリ数は木の深さに依存するため空間計算量も効率的です。DFSによる再帰的なアプローチを採用することで、最も深い葉ノードの合計をシンプルかつ確実に求めることができます。

  1. C++で平行四辺形の面積を求めるプログラムの作成方法

    この記事では、平行四辺形の底辺と高さを表す2つの値が与えられたとき、C++を使ってその面積を求めるプログラムを作成する方法を解説します。 平行四辺形とは? 平行四辺形とは、4つの辺からなる閉じた図形であり、向かい合う2組の辺がそれぞれ長さが等しく、互いに平行になっている四角形のことです。 問題を理解するための具体例 入力 B = 20, H = 15 出力 300 説明 平行四辺形の面積 = 底辺 × 高さ = 20 × 15 = 300 解決アプローチ この問題を解くには、平行四辺形の面積を求める幾何学の公式を使用します。 面積 = 底辺 × 高さ つまり、与えられた底辺と高さを掛け合わせ

  2. C++で完全二分木の全ノードの合計を効率的に求める方法

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