バイナリーツリー?そして、最大パス!
タイトル:
空でないバイナリツリーを考えると、その最大のパスを返します。
この問題では、任意のノードの配列に、ツリーの任意のノードからの経路として定義されます。パスは、少なくとも一つのノードを含んでおり、必ずしもルートノードを通ります。
実施例
実施例1:
入力:[1,2,3]
1
/ \
2 3
出力:6
実施例2:
入力:[-10,9,20、NULL、NULL、 15,7]
-10
/ \
9 20
/ \
15 7
出力:42
トピック分析
- 目標:バイナリツリーノードとその最大のパスを見つけるために⇒
ノードのための
フォワードノードに行く⇒左/右ノード
パス(右ノードを起動/左ノードに)現在のノード値+ =残差経路及びノード値は、再帰的⇒
問題解決のためのアイデア
変数 | 効果 |
---|---|
()を見つけます | パスを見つけるにし、 |
プロセス
- キューs内のバイナリツリーのルート
- ⇒(出発点として右ノードに)行くために正しい道を(出発点として左ノードに)左側に移動するノードを探して+パスと
- 最大のパスを更新するかどうかを決定します
- 左ノードは2,3秒繰り返さキューイングされます
コードは以下の通りです
int find(TreeNode*root) //寻找 root 为起点的最大路径结点和
{
if(!root) return 0;
int left = 0, right = 0;
if(!root->left && !root->right) return root->val;
if(root -> left) left += find(root->left);
if(root -> right) right += find(root->right);
return max(max(root->val,root->val+left),root->val+right);
}
class Solution {
public:
int maxPathSum(TreeNode* root) {
if(!root) return 0;
int max0 = root->val;
queue<TreeNode*> s{{root}};
while(!s.empty())
{
TreeNode* temp = s.front();
s.pop();
int left = find(temp->left); //向左走
int right = find(temp->right); //向右走
max0 = max(max(max(temp->val,temp->val+left),max(temp->val+right,temp->val+left+right)),max0); //判断是否更新最大值
if(temp->left) s.push(temp->left);
if(temp->right) s.push(temp->right);
}
return max0;
}
};