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

C++で文字列として表現された二分木のk番目のレベルにあるノードの積を求める方法

はじめに

文字列形式で表現された二分木が与えられたとき、k番目のレベルに存在するノードの値の積を求めるのが本記事の目的です。二分木の各ノードは、データ部分・左部分木を指すポインタ・右部分木を指すポインタの3つの要素で構成されています。

二分木のレベルは0から始まり、任意の正の整数nまで続きます。ここでは、レベル「k」が与えられ、そのレベルにあるノードの値の積をプログラムで計算します。

例えば、次のような二分木に対してk=2が与えられた場合を考えてみましょう。

レベル2のノードは − 40、50、60 です。

積 = 40 × 50 × 60 = 120,000

C++で文字列として表現された二分木のk番目のレベルにあるノードの積を求める方法

入力例1

(1(2(3()())(4()(5()())))(6(7()())(8()())))
K = 1

出力例1

product of nodes at level k = 12

入力例2

(0(5(6()())(4()(9()())))(7(1()())(3()())))
k = 2

出力例2

product of nodes at level k = 72

アルゴリズムの考え方

この問題は、木を実際に構築しなくても、文字列を直接走査することで効率的に解くことができます。文字列は括弧によって木の構造を表現しているため、次の手順で処理します。

  • 文字列を左から右へ1文字ずつ走査します。
  • 開き括弧「(」に遭遇したら、現在のレベルを1つ深くします(level++)。
  • 閉じ括弧「)」に遭遇したら、現在のレベルを1つ浅くします(level--)。
  • 数字(ノードのデータ)に遭遇したとき、現在のレベルがkと一致していれば、その値を積に乗算します。

この方法の計算量はO(n)(nは文字列の長さ)で、木を構築するための追加メモリも不要なため、非常に効率的です。

アルゴリズム

開始
ステップ1 → k番目のレベルのノードの積を計算する関数を宣言
    int product(string tree, int k)
      int level = -1 を宣言
      int product = 1 を宣言
      int size = tree.length() を宣言
      ループ: int i = 0 から i < size まで i++ ごとに
          IF tree[i] = '(' の場合
            level++ を実行
          End
          ELSE IF tree[i] = ')' の場合
            level-- を実行
          End
          ELSE の場合
            IF level = k の場合
              product *= (tree[i] - '0') を実行
            End
          End
      End
      return product
ステップ2 → main() 内で
    string tree = "(1(2(3()())(4()(5()())))(6(7()())(8()())))" を宣言
    int k = 1 を宣言
    product(tree, k) を呼び出す
終了

実装例(C++)

#include <bits/stdc++.h>
using namespace std;
//k番目のレベルの積を求める
int product(string tree, int k){
    int level = -1;
    int product = 1;
    int size = tree.length();
    for (int i = 0; i < size; i++){
        if (tree[i] == '(')
            level++;
        else if (tree[i] == ')')
            level--;
        else{
            if (level == k)
                product *= (tree[i] - '0');
        }
    }
    return product;
}
int main(){
    string tree = "(1(2(3()())(4()(5()())))(6(7()())(8()())))";
    int k = 1;
    cout <<"product of nodes at level k = "<<product(tree, k);
    return 0;
}

出力

上記のコードを実行すると、次の出力が得られます。

product of nodes at level k = 12
  1. C++で二分木の各レベルにおける最大の積を求めるアルゴリズム

    問題の概要 正の値と負の値が混在するノードで構成された二分木が与えられたとします。このとき、木の各レベルに存在するノードの値の積を計算し、その中で最大となる値を求める必要があります。 例として、次のような二分木を考えてみましょう。 この木の場合、各レベルの積は以下のように計算できます。 レベル0の積:4 レベル1の積:2 × (-5) = -10 レベル2の積:(-1) × 3 × (-2) × 6 = 36 したがって、この木における最大のレベル積は 36 となります。 解決のアプローチ この問題は、木をレベル順走査(幅優先探索・BFS)でたどることで効率的に解けます。キューを利用して

  2. C++で二分木のすべてのノードのレベルを出力する方法

    二分木(バイナリツリー)が与えられたとき、各ノードに格納されたすべてのキーについて、そのノードが属するレベル(根をレベル1として数える)を出力するのが本記事の目的です。上記の木では、ノードは次のように配置されています。10 はレベル 1 3 と 211 はレベル 2 140、162、100、146 はレベル 3特定のキーが与えられた場合、プログラムはそのキーが属するレベルを出力できなければなりません。入出力例入力: 10 3 211 140 162 100 146 出力:     10 のレベルは 1     3