C++での二分木の最大レベルの合計
二分木のルートがあり、そのルートのレベルが1、子のレベルが2などであるとします。レベルXのノードのすべての値の合計が最大になるように、最小のレベルXを返す必要があります。したがって、ツリーが次のような場合-
出力は2になり、レベル1の合計=1、レベル2の合計は7 + 0 =7、レベル2の合計は7 +(-8)=-1になるため、最大値はレベルになります。 2なので、出力は2です。
これを解決するには、次の手順に従います-
- level:=1、sum:=rの値、ansLevel:=level、ansSum:=sum
- キューqを定義し、指定されたノードrをqに挿入します
- qが空でない間
- 容量:=qのサイズ
- レベルを1増やし、合計:=0
- 容量が0ではない場合
- node:=qからフロントノード、qからノードを削除
- ノードの右側が有効な場合、sum:=sum +右側のノードの値、右側のノードをqに挿入します
- ノードの左側が有効な場合、sum:=sum +左側のノードの値、左側のノードをqに挿入します
- 容量を1つ減らします
- ansSum
- ansLevelを返す
例(C ++)
理解を深めるために、次の実装を見てみましょう-
#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 maxLevelSum(TreeNode* r) { int level = 1, sum = r->val; int ansLevel = level, ansSum = sum; queue <TreeNode*> q; q.push(r); while(!q.empty()){ int capacity = q.size(); level++; sum = 0; while(capacity--){ TreeNode* node = q.front(); q.pop(); if(node->right){ sum += node->right->val; q.push(node->right); } if(node->left){ sum += node->left->val; q.push(node->left); } } if(ansSum<sum){ ansSum = sum; ansLevel = level; } } return ansLevel; } }; main(){ vector<int> v = {1,7,0,7,-8,NULL,NULL}; TreeNode *root = make_tree(v); Solution ob; cout <<ob.maxLevelSum(root); }
入力
[1,7,0,7,-8,null,null]
出力
2
-
バイナリツリーがC++でレベルごとにソートされているかどうかを確認します
ここでは、二分木がレベルごとにソートされているかどうかを確認する方法を説明します。レベルごとにソートされた二分木は次のようになります- 各レベルでは、ノードは左から右に並べ替えられ、各レイヤーには前のレベルよりも高い値が含まれています。 レベル順序トラバーサルを実行することでこの問題を解決し、現在のレベルの最小要素と最大要素を追跡できます。別の変数prev_maxを使用して、前のレベルの最大値を保持します。次に、現在のレベルの最小値と前のレベルの最大値prev_maxを比較します。 min値がprev_maxより大きい場合、ツリーは現在のレベルまでレベルごとに並べ替えられます。次に、
-
バイナリツリーがC++でレベルごとにソートされているかどうかを確認します
ここでは、二分木がレベルごとにソートされているかどうかを確認する方法を説明します。レベルごとにソートされた二分木は次のようになります- 各レベルでは、ノードは左から右に並べ替えられ、各レイヤーには前のレベルよりも高い値が含まれています。 レベル順序トラバーサルを実行することでこの問題を解決し、現在のレベルの最小要素と最大要素を追跡できます。別の変数prev_maxを使用して、前のレベルの最大値を保持します。次に、現在のレベルの最小値と前のレベルの最大値prev_maxを比較します。 min値がprev_maxより大きい場合、ツリーは現在のレベルまでレベルごとに並べ替えられます。次に、