C++で親配列によって表される二分木の高さを見つける
この問題では、ツリーを表すサイズnの配列arr[]が与えられます。私たちのタスクは、親配列で表される二分木の高さを見つけることです。
二分探索木(BST) は、すべてのノードが以下のプロパティに従うツリーです-
- 左側のサブツリーのキーの値が、その親(ルート)ノードのキーの値よりも小さいです。
- 右側のサブツリーのキーの値は、その親(ルート)ノードのキーの値以上です。
木の高さ ルートノードから最も遠いリーフノードに移動するときに通過するノードの数です。
ソリューションアプローチ:
この問題の簡単な解決策は、親配列からツリーを作成することです。このツリーのルートを検索し、見つかったインデックスを繰り返して左右のサブツリーを作成し、最大の高さを返します。
より効率的な方法は、配列からノードの深さを計算し、それを深さ配列に格納してから格納することです。この配列から最大深度を返します。
ソリューションの動作を説明するプログラム
例
#include <bits/stdc++.h> using namespace std; void findAllDepths(int arr[], int i, int nodeDepth[]) { if (nodeDepth[i]) return; if (arr[i] == -1) { nodeDepth[i] = 1; return; } if (nodeDepth[arr[i]] == 0) findAllDepths(arr, arr[i], nodeDepth); nodeDepth[i] = nodeDepth[arr[i]] + 1; } int findMaxHeightBT(int arr[], int n) { int nodeDepth[n]; for (int i = 0; i < n; i++) nodeDepth[i] = 0; for (int i = 0; i < n; i++) findAllDepths(arr, i, nodeDepth); int maxHeight = nodeDepth[0]; for (int i=1; i<n; i++) if (maxHeight < nodeDepth[i]) maxHeight = nodeDepth[i]; return maxHeight; } int main() { int arr[] = {-1, 0, 0, 1, 1}; int n = sizeof(arr)/sizeof(arr[0]); cout<<"The maximum height of binary Tree is "<<findMaxHeightBT(arr, n); return 0; }
出力-
The maximum height of binary Tree is 3
-
C++で配列を実装した二分木
二分木は、ツリーの各ノードが最大2つの子ノードを持つことができる特殊なタイプのツリーです。これらの子ノードは、右子および左子と呼ばれます。 単純な二分木は-です 木を表現するには、2つの方法があります。 リンクリストを使用する動的ノード表現 配列を使用する順次表現。 ここでは、二分木の配列表現について説明します。このために、BTのノードに番号を付ける必要があります。この番号付けは、0から(n-1)または1からnまで開始できます。 配列内のノードとその親ノードおよび子ノードの位置を導き出します。 0インデックスベースのシーケンスを使用する場合 親ノードがインデックスpであ
-
C++の二分木で最大垂直和を見つける
二分木があるとします。タスクは、垂直順序トラバーサルのすべてのノードの合計の最大値を出力することです。したがって、ツリーが以下のようになっている場合- 垂直方向の走査は-のようなものです 4 2 1 + 5 + 6 = 12 3 + 8 = 11 7 9 ここでの最大値は12です。アプローチは単純です。垂直順序トラバーサルを実行してから、合計を見つけて最大値を確認します。 例 #include<iostream> #include<map> #include<vector> #include<queue> using namespace