C++での二分木の最大幅
二分木があるとすると、与えられた木の最大幅を取得する関数を定義する必要があります。ここで、木の幅はすべてのレベルの中で最大の幅です。二分木は完全な二分木と同じ構造であると考えますが、一部のノードはnullです。 1つのレベルの幅は、実際にはエンドノード間の長さです(レベル内の左端と右端の非ヌルノード。エンドノード間のヌルノードも長さの計算にカウントされます)。したがって、ツリーが次のような場合-
最後のレイヤーのノードは[5,3、null、9]
であるため、最大幅は4です。これを解決するには、次の手順に従います-
-
ans:=1、サイズ:=0
-
(ノード、値)ペアを格納する両端キューqを定義します。
-
(root、1)をqに挿入します
-
qが空ではない間
-
サイズ:=qのサイズ
-
(ノード、値)ペアcurrを定義する
-
サイズが1の場合、(前の要素のノード、1)をqに入れ、qから要素を削除します
-
サイズが0ではない場合
-
curr:=qのフロント要素、qからフロント要素を削除
-
currノードの左側がnullでない場合、
-
(現在のノードの左側、currの2 *値)を作成し、qに挿入します
-
-
currノードの権利がnullでない場合、
-
(現在のノードの右側、currの2 *値+1)を作成し、qに挿入します
-
-
サイズがq>1の場合、
-
ans:=ansの最大値、qの最後の要素の値– q+1の最初の要素の値
-
-
サイズ:=サイズ– 1
-
-
-
ansを返す
理解を深めるために、次の実装を見てみましょう-
例
#include <bits/stdc++.h>
using namespace std;
class TreeNode{
public:
int val;
TreeNode *left, *right;
TreeNode(int data){
val = data;
left = NULL;
right = NULL;
}
};
void insert(TreeNode **root, int val){
queue<TreeNode*> q;
q.push(*root);
while(q.size()){
TreeNode *temp = q.front();
q.pop();
if(!temp->left){
if(val != NULL)
temp->left = new TreeNode(val);
else
temp->left = new TreeNode(0);
return;
}else{
q.push(temp->left);
}
if(!temp->right){
if(val != NULL)
temp->right = new TreeNode(val);
else
temp->right = new TreeNode(0);
return;
}else{
q.push(temp->right);
}
}
}
TreeNode *make_tree(vector<int> v){
TreeNode *root = new TreeNode(v[0]);
for(int i = 1; i<v.size(); i++){
insert(&root, v[i]);
}
return root;
}
class Solution {
public:
int widthOfBinaryTree(TreeNode* root) {
int ans = 0;
deque < pair <TreeNode*, int> > q;
q.push_back({root,1});
ans = 1;
int size;
while(!q.empty()){
size = q.size();
pair <TreeNode*, int> curr;
if(size == 1){
q.push_back({q.front().first, 1});
q.pop_front();
}
while(size--){
curr = q.front();
q.pop_front();
if(curr.first->left){
q.push_back({curr.first->left, 2 * curr.second});
}
if(curr.first->right){
q.push_back({curr.first->right, 2 * curr.second + 1});
}
}
if(q.size() > 1)
ans = max(ans, q.back().second - q.front().second + 1);
}
return ans;
}
};
main(){
vector<int> v = {1,3,2,5,3,NULL,9};
TreeNode *root = make_tree(v);
Solution ob;
cout << (ob.widthOfBinaryTree(root));
} 入力
[1,3,2,5,3,null,9]
出力
4
-
C++のバイナリツリーで最大レベルの製品を検索します
1つの二分木が与えられたと仮定します。正と負のノードがあります。各レベルで最大の製品を見つける必要があります。 これがツリーであると考えると、レベル0の積は4、レベル1の積は2 * -5 =-10、レベル2の積は-1 * 3 * -2 * 6=36です。最大1つ。 これを解決するために、ツリーのレベル順トラバーサルを実行します。トラバーサル中に、異なるレベルのノードを個別に実行するプロセスを実行します。次に、最大の製品を入手します。 例 #include<iostream> #include<queue> using namespace std; class
-
C++の二分木で最大垂直和を見つける
二分木があるとします。タスクは、垂直順序トラバーサルのすべてのノードの合計の最大値を出力することです。したがって、ツリーが以下のようになっている場合- 垂直方向の走査は-のようなものです 4 2 1 + 5 + 6 = 12 3 + 8 = 11 7 9 ここでの最大値は12です。アプローチは単純です。垂直順序トラバーサルを実行してから、合計を見つけて最大値を確認します。 例 #include<iostream> #include<map> #include<vector> #include<queue> using namespace