인접하지 않은 최대 트리 합계

설명



이진 트리root가 주어지면 두 개의 정수가 상위에서 하위로 인접할 수 없는 경우 얻을 수 있는 정수의 최대 합계를 반환합니다.

제약:
  • n ≤ 100,000 여기서 nroot의 노드 수입니다.

  • 예시 1



    입력




    root = [1, [4, [3, null, null], [2, null, null]], [5, null, null]]
    


    Untitled

    산출




    10
    


    설명




    We can pick 3, 2 and 5. Note if we picked 4, we wouldn't be able to pick 3 and 2 since they are adjacent.
    



    직관



    dfs + dp

    구현




    /**
     * class Tree {
     *     public:
     *         int val;
     *         Tree *left;
     *         Tree *right;
     * };
     */
    
    pair<int, int> dfs(Tree* node) {
        if (!node) return make_pair(0, 0);
        auto [leftWith, leftWithout] = dfs(node->left);
        auto [rightWith, rightWithout] = dfs(node->right);
    
        int withRoot = leftWithout + rightWithout + node->val;
        int withoutRoot = max(leftWith, leftWithout) + max(rightWith, rightWithout);
    
        return make_pair(withRoot, withoutRoot);
    }
    int solve(Tree* root) {
        auto [with, without] = dfs(root);
        return max(with, without);
    }
    


    시간 복잡도


  • 시간: O(n)
  • 공백: O(logn)
  • 좋은 웹페이지 즐겨찾기