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

C++で二分木のすべての右ノードから最大値を見つける方法

この記事では、二分木(バイナリツリー)が与えられたときに、すべての右ノードの中から最大値を見つける方法を解説します。

問題の概要

与えられた二分木に含まれるすべての「右の子ノード」の値を調べ、その中で最大の値を求めるのが目的です。

入力例

以下のような二分木を考えてみましょう。

        5
       / \
      3   2
     / \ / \
    1  8 6  9

出力例

9

解説

この木における右の子ノードは {2, 8, 9} の3つです。これらの中で最大の値は 9 となります。

解決アプローチ

この問題は、木を再帰的に走査しながら解くことができます。基本的な考え方は以下のとおりです。

  • 各ノードを訪問し、そのノードに右の子が存在するかどうかを確認します。
  • 右の子が存在する場合は、その値を現在の最大値(maxRight)と比較し、より大きければ更新します。
  • 左部分木と右部分木に対しても再帰的に同じ処理を行い、全体の最大値を求めます。

C++による実装例

それでは、実際のコードを見ていきましょう。

#include <iostream>
using namespace std;

struct Node {
    int data;
    struct Node *left, *right;
};

Node* newNode(int data) {
    Node* temp = new Node;
    temp->data = data;
    temp->left = temp->right = NULL;
    return temp;
}

int findMaxRightNode(Node* root) {
    int maxRight = -100;

    if (root == NULL)
        return -1;

    if (root->right != NULL)
        maxRight = root->right->data;

    return max( findMaxRightNode(root->right),
                max(maxRight, findMaxRightNode(root->left)) );
}

int main() {
    Node* root = newNode(5);
    root->left = newNode(3);
    root->right = newNode(2);
    root->left->left = newNode(1);
    root->left->right = newNode(8);
    root->right->left = newNode(6);
    root->right->right = newNode(9);

    cout << "二分木のすべての右ノードの中の最大値は "
         << findMaxRightNode(root);

    return 0;
}

実行結果

二分木のすべての右ノードの中の最大値は 9

コードのポイント

  • newNode関数: 新しいノードを作成し、左右の子ポインタをNULLで初期化するヘルパー関数です。
  • findMaxRightNode関数: 再帰的に木を走査します。現在のノードに右の子があれば、その値をmaxRightに記録し、左部分木・右部分木の探索結果と比較して最大値を返します。
  • 計算量: 各ノードを一度ずつ訪問するため、時間計算量はO(N)、Nはノード数です。

このように、シンプルな再帰処理を用いることで、二分木のすべての右ノードの中から効率的に最大値を見つけることができます。

  1. C++で二分木の最大垂直和を求める方法

    はじめに二分木が与えられたとき、垂直順序走査における各垂直列のノード値の合計を計算し、その中から最大値を求めて出力するのが本記事の課題です。例として、以下のような二分木を考えてみましょう。この二分木を垂直順序走査すると、各列の合計は次のようになります。4 2 1 + 5 + 6 = 12 3 + 8 = 11 7 9各列の合計の中で最大となるのは 12 です。アルゴリズムの考え方アプローチはシンプルです。幅優先探索(BFS)を用いて垂直順序走査を行い、各ノードに水平距離を割り当てます。ルートの水平距離を 0 とし、左に移動するごとに -1、右に移動するごとに +1 とします。同じ水平距離を持つ

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

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