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

特定の二分木がC++の赤黒木と同じように高さのバランスが取れているかどうかを確認します


コンセプト

赤黒木に関しては、ノードの最大の高さは最大で最小の高さの2倍です。特定の二分探索木について、次のプロパティを確認する必要があります。

すべてのノードに関して、リーフからノードへの最長パスの長さは、ノードからリーフへの最短パス上のノードの2倍以下です。

13    41
\    / \
15  11 101
\   /    \
17 61 151

上の木は赤黒木にすることはできません上の木は任意の色の割り当てで赤黒木にすることができます

13の最大高さは1です

13の最小の高さは3です

   11
  / \
 6   101
 /    \
51    151
/
41

ツリーの上は赤黒木にすることもできます

この場合、予想される時間計算量はO(n)です。ツリーは、ソリューション内で最大1回アクセスする必要があります。

メソッド

すべてのノードに関して、最大と最小の高さを取得して比較する必要があります。コンセプトは、ツリーにアクセスし、すべてのノードでバランスが取れているかどうかを確認することです。必要なのは、ツリーのバランスが取れているかどうかを示すブール値、最小の高さと最大の高さの3つを返す再帰関数を作成することです。複数の値を返す場合は、構造体を適用するか、参照によって変数を渡すことができます。maxhおよびminhby参照の受け渡しは、値を親呼び出しに適用できるように実行されます。

/* This program to check whether a given Binary Tree is balanced like a Red-Black Tree or not */
#include <bits/stdc++.h>
using namespace std;
struct Node1{
   int key;
   Node1 *left, *right;
};
Node1* newNode(int key){
   Node1* node1 = new Node1;
   node1->key = key;
   node1->left = node1->right = NULL;
   return (node1);
}
bool isBalancedUtil(Node1 *root, int &maxh1, int &minh1){
   if (root == NULL){
      maxh1 = minh1 = 0;
      return true;
   }
   int lmxh1, lmnh1;
   int rmxh1, rmnh1;
   if (isBalancedUtil(root->left, lmxh1, lmnh1) == false)
      return false;
   if (isBalancedUtil(root->right, rmxh1, rmnh1) == false)
      return false;
   maxh1 = max(lmxh1, rmxh1) + 1;
   minh1 = min(lmnh1, rmnh1) + 1;
   if (maxh1 <= 2*minh1)
      return true;
   return false;
}
bool isBalanced(Node1 *root){
   int maxh1, minh1;
   return isBalancedUtil(root, maxh1, minh1);
}
/* Driver program to test above functions*/
int main(){
   Node1 * root = newNode(11);
   root->left = newNode(6);
   root->right = newNode(101);
   root->right->left = newNode(51);
   root->right->right = newNode(151);
   root->right->left->left = newNode(41);
   isBalanced(root)? cout << "Balanced" : cout << "Not Balanced";
   return 0;
}

出力

Balanced

  1. バイナリツリーがC++でレベルごとにソートされているかどうかを確認します

    ここでは、二分木がレベルごとにソートされているかどうかを確認する方法を説明します。レベルごとにソートされた二分木は次のようになります- 各レベルでは、ノードは左から右に並べ替えられ、各レイヤーには前のレベルよりも高い値が含まれています。 レベル順序トラバーサルを実行することでこの問題を解決し、現在のレベルの最小要素と最大要素を追跡できます。別の変数prev_maxを使用して、前のレベルの最大値を保持します。次に、現在のレベルの最小値と前のレベルの最大値prev_maxを比較します。 min値がprev_maxより大きい場合、ツリーは現在のレベルまでレベルごとに並べ替えられます。次に、

  2. 特定の二分木がPythonの赤黒木と同じように高さのバランスが取れているかどうかを確認します

    赤黒木があると仮定します。ここでは、ノードの最大の高さは最大で最小の高さの2倍です。二分探索木がある場合は、次のプロパティを確認する必要があります。すべてのノードに関して、リーフからノードへの最長パスの長さは、ノードからリーフへの最短パス上のノードの2倍以下です。 したがって、入力が次のような場合 バランスが取れているため、出力はTrueになります。 これを解決するには、次の手順に従います- 関数solve()を定義します。これはルート、max_height、min_heightを取ります rootがnullの場合、 max_height:=0、min_height:=0