バイナリツリーleetcode 124における最大パス

バイナリーツリー?そして、最大パス!

タイトル:
空でないバイナリツリーを考えると、その最大のパスを返します。
この問題では、任意のノードの配列に、ツリーの任意のノードからの経路として定義されます。パスは、少なくとも一つのノードを含んでおり、必ずしもルートノードを通ります。

実施例
実施例1:
入力:[1,2,3]

   1
  / \
 2   3

出力:6

実施例2:
入力:[-10,9,20、NULL、NULL、 15,7]

   -10
   / \
  9  20
    /  \
   15   7

出力:42

トピック分析

  • 目標:バイナリツリーノードとその最大のパスを見つけるために⇒

ノードのための
フォワードノードに行く⇒左/右ノード
パス(右ノードを起動/左ノードに)現在のノード値+ =残差経路及びノード値は、再帰的⇒

問題解決のためのアイデア

変数 効果
()を見つけます パスを見つけるにし、

プロセス

  1. キューs内のバイナリツリーのルート
  2. ⇒(出発点として右ノードに)行くために正しい道を(出発点として左ノードに)左側に移動するノードを探して+パスと
  3. 最大のパスを更新するかどうかを決定します
  4. 左ノードは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;
    }
};
公開された34元の記事 ウォンの賞賛0 ビュー572

おすすめ

転載: blog.csdn.net/Luyoom/article/details/104939985