【leetcode】binary-tree-maximum-path-sum

1853 단어 leetcode
제목:
Given a binary tree, find the maximum path sum.
The path may start and end at any node in the tree.
For example: Given the below binary tree,
       1
      / \
     2   3

Return6.
문제 해결:
두 갈래 나무를 정해서 최대 경로와
경로는 트리의 모든 노드에서 시작하고 끝낼 수 있습니다.
예:
아래의 두 갈래 나무를 주고,

/\
2 3
Return6.
내부 질문 목록:
마지막 큰 문제 답안, 가능한 경로의 출처는 다음과 같다.
1. 루트+left 경로;
2. 루트+right 경로;
3. 루트+right 경로+left 경로;
4. 루트 단일한 결점;
코드를 작성하는 과정에서 발생할 수 있는 문제:
1. 결점의 값은 음수일 수 있다.따라서 최대 경로의 초기 값은 최소 값으로 설정해야 한다.
2. 하위 트리 노드에서 되돌아오는 가장 큰 경로와 세 번째 상황이 나타날 수 없음(해결 방법: 우리는 이 형이 가장 큰 경로max를 알고 있는 것을 저장해야 한다).
코드 구현:
/**
 * Definition for binary tree
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
#include
class Solution {
public:
     int _maxPathSum(TreeNode *root,int &max)
    {
        // 
        if(root == NULL)
        {
            return 0;
        }
         // 
        int left  = _maxPathSum(root->left,max) ;
        int right = _maxPathSum(root->right,max) ;
        int data = root->val;
        int sum = left+right+data;
        // max 
        max = max < (left+data)?(left+data):max;
        max = max < (right+data)?(right+data):max;
        max = max < data?data:max;
        max = max < sum?sum:max;
        // 
        int  ret = data;
        ret = ret < left+data?left+data:ret;
        ret = ret < right +data?right+data:ret;
		return ret;
    }
    int maxPathSum(TreeNode *root) {
        if(root == NULL)
        {
            return  0;
        }
        // max int 
        int max = 0x80000000;
        _maxPathSum(root,max);
        return max;
    }
};

좋은 웹페이지 즐겨찾기