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

C++で二分木が高さバランスされているかどうかを判定するプログラム

C++で二分木の高さバランスを判定する方法

二分木が与えられたとき、その木が「高さバランス」されているかどうかを判定する必要があります。

高さバランスされた木とは、すべてのノードにおいて、左部分木の高さと右部分木の高さの絶対差が0または1以内に収まっている木のことです。

例えば、以下のような二分木が入力として与えられたとします。

C++で二分木が高さバランスされているかどうかを判定するプログラム

この場合、出力は True(バランスされている)となります。

解決のアプローチ

この問題を解くには、DFS(深さ優先探索)を利用して各ノードの部分木の高さを計算し、その差を確認します。手順は以下の通りです。

  • dfs() 関数を定義し、ノードを引数として受け取ります。
  • ノードがNULLの場合は 0 を返します(高さ0)。
  • 左部分木の高さ l を「1 + dfs(左の子ノード)」として計算します。
  • 右部分木の高さ r を「1 + dfs(右の子ノード)」として計算します。
  • |l - r| > 1 となる場合、フラグ変数 retfalse に設定します。
  • lr の最大値を返します(現在のノードを根とする部分木の高さ)。
  • メイン処理では、まず ret = true で初期化し、根ノードに対して dfs(root) を実行した後、ret を返します。

C++での実装例

以下の実装例を見ると、理解がより深まるでしょう。

#include <bits/stdc++.h>
using namespace std;
class TreeNode {
    public:
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
class Solution {
    public:
    bool ret;
    int dfs(TreeNode* node){
        if(!node)
            return 0;
        int l = 1 + dfs(node->left);
        int r = 1 + dfs(node->right);
        if(abs(l - r) > 1)
            ret = false;
        return max(l, r);
    }
    bool isBalanced(TreeNode* root) {
        ret = true;
        dfs(root);
        return ret;
    }
};
main(){
    Solution ob;
    TreeNode *root = new TreeNode(25);
    root->left = new TreeNode(19);
    root->right = new TreeNode(4);
    root->left->left = new TreeNode(9);
    root->left->right = new TreeNode(7);
    cout << (ob.isBalanced(root));
}

入力

TreeNode *root = new TreeNode(25);
root->left = new TreeNode(19);
root->right = new TreeNode(4);
root->left->left = new TreeNode(9);
root->left->right = new TreeNode(7);

出力

1

この結果 1(true)は、与えられた二分木が高さバランスされていることを示しています。

  1. C++で木グラフ(ツリーグラフ)が線形かどうかを判定する方法

    本記事では、C++を使って与えられた木グラフ(ツリーグラフ)が「線形(リニア)」であるかどうかを判定する方法を解説します。線形の木グラフとは、すべてのノード(頂点)を一本の線上に連ねて表現できるグラフのことです。 線形木グラフとは たとえば、下の図のようなグラフは一本の線で表現できるため、線形の木グラフです。 一方、次のように途中で分岐(複数の子ノード)を持つ木は線形ではありません。 線形グラフを判定する条件 ある木グラフが線形かどうかは、次の2つの条件で確認できます。 ノード数が1の場合、その木グラフは線形である。 n個のノードのうち (n − 2) 個のノードの次数が2である場合、そ

  2. C++で有向グラフの強連結成分を検出するプログラムの作成方法

    有向グラフにおいて、ある成分内の任意の頂点ペア同士の間に経路が存在するとき、その成分は「強く接続されている(強連結)」といいます。このような成分のことを強連結成分(SCC: Strongly Connected Components)と呼びます。この問題を解くには、まずDFS(深さ優先探索)を使って各頂点の完了時刻(finish time)を求めます。次にグラフを転置し、完了時刻をもとに頂点を降順に並べる(トポロジカルソート)ことで、強連結成分を一つずつ取り出します。これは有名なKosarajuのアルゴリズムに基づいた手法です。入力: グラフの隣接行列001101000001000000010