[Leet Code] 124번: 두 갈래 나무의 최대 경로와

1768 단어 leetcode핸드 코드
LeetCode 링크:https://leetcode-cn.com/problems/binary-tree-maximum-path-sum/
본고는 좌신 알고리즘 중의 두 갈래 나무 중의 가장 먼 거리를 비교할 수 있다. 단지 가장 먼 거리에서 권중을 고려하지 않은 문제일 뿐이다. 본고는 각 노드의 권중을 고려해야 하는데 차이가 있다.
제목: 비공 두 갈래 트리를 지정하고 최대 경로와 를 되돌려줍니다.
본고에서 경로는 나무의 임의의 노드에서 출발하여 임의의 노드에 도달하는 서열로 정의되었다.이 경로는 루트 노드를 거치지 않고 하나 이상의 노드를 포함합니다.
예 1:
입력: [1,2,3]
       1      / \     2   3
출력: 6 예 2:
입력: [-10,9,20,null,null,15,7]
   -10    /  \  9  20     / \   15   7
출력: 42
제목에 따라 최대 경로는 왼쪽 트리, 오른쪽 트리, 루트 노드와 왼쪽 트리에 나타날 수 있습니다.우리의 사고방식은bottom에서topreturn으로 돌아가는 과정에서 왼쪽 트리와 오른쪽 트리의 경로가 더 큰 것을 기록하고 부모 노드에 현재 노드와 하위 트리로 구성된 최대치를 제공하는 것이다.
반복 설계:
1. 반환값: (root.val) + max(left,right) 즉 이 노드와 좌우 트리의 최대 값의 합으로 비교적 나쁜 해답은 버려지고 더 이상 사용되지 않습니다.
  • 주의해야 할 것은 만약에 계산 결과 tmp<=0이 루트 노드에 마이너스 공헌을 한다는 것을 의미하고 어떠한 상황에서도 이 길(부 노드 중단)을 선택하지 않기 때문에 0으로 되돌아간다는 것이다

  • 2. 귀속 중지 조건: 잎 노드를 넘어 0으로 돌아간다.
    3. 레코드 최대값: 현재 노드 최대값 = root.val + left + right.
    4. 최종적으로 모든 경로의 전역 최대치를 되돌려주면 된다
    public class MaxPathSum_124 {
    
        public class TreeNode{
            public int val;
            public TreeNode left;
            public TreeNode right;
    
            public TreeNode(int val){
                this.val = val;
            }
        }
    
        // maxSum 
        private int maxSum = Integer.MIN_VALUE;
    
        private int maxPathSum(TreeNode root){
            maxPath(root);
            return maxSum;
        }
    
        private int maxPath(TreeNode root){
            if(root == null){
                //  0
                return 0;
            }
            int left = maxPath(root.left);
            int right = maxPath(root.right);
            maxSum = Math.max(left + right + root.val, maxSum);
            int temp = Math.max(left, right) + root.val;
            return temp > 0 ? temp : 0;
        }
    }
    

    좋은 웹페이지 즐겨찾기