Leetcode 일일 질문: 1448. 이진 트리에서 좋은 노드 수 계산

원래 제목

루트가 있는 이진 트리가 주어  root 지면 이진 트리의 양호한 노드 수를 반환하십시오.

"좋은 노드" X는 다음과 같이 정의됩니다. 루트에서 노드 X로 전달되는 노드 중 어떤 노드의 값도 X의 값보다 크지 않습니다.

예시 1:

입력: root = [3,1,4,3,null,1,5]
 출력: 4
 설명: 그래프의 파란색 노드는 좋은 노드입니다. 
루트 노드(3)는 항상 좋은 노드입니다. 
노드 4 -> (3,4)는 경로의 최대값입니다. 
노드 5 -> (3,4,5)는 경로의 최대값입니다. 
노드 3 -> (3,1,3)은 경로의 최대값입니다.

예 2:

입력: root = [3,3,null,4,2]
 출력: 3
 설명: 노드 2 -> (3, 3, 2)는 "3"이 노드보다 크기 때문에 좋은 노드가 아닙니다.

예시 3:

입력: root = [1]
 출력: 1
 설명: 루트 노드는 좋은 노드입니다.

힌트:

  • 이진 트리의 노드 수 범위는 입니다  [1, 10^5] .
  • 각 노드의 가중치 범위는 입니다  [-10^4, 10^4] .

문제 해결 아이디어

분명히 우리는 각 노드를 순회하고 현재 경로의 최대값을 함께 전달해야 합니다. 이는 경로 깊이와 관련된 문제입니다. 순회를 구현하려면 DFS를 사용하는 것을 고려하십시오.

class Solution {
public:
    int goodNodes(TreeNode* root) {
        return dfs(root);
    }

    void dfs(TreeNode* root) {
        if(root == nullptr){
            return;
        }
        visit(root);
        dfs(root->left);
        dfs(root->right);
    }
};

 현재 노드 루트가 있고 업로드된 경로의 최대값 path_max가 있다고 가정합니다. 현재 노드 값이 path_max보다 작으면 path_max를 왼쪽 및 오른쪽 노드에 계속 전달합니다. 현재 노드 값이 path_max보다 큰 경우 path_max를 현재 노드 값으로 설정하고 path_max를 왼쪽 및 오른쪽 노드에 전달합니다. 현재 노드의 양호한 노드 수는 왼쪽 노드와 오른쪽 노드의 노드 수의 합에 1을 더한 값과 같으며, 현재 노드가 양호한 노드이면 추가되지 않습니다. 루트 노드가 좋은 노드여야 한다는 점을 고려하여 INT_MIN을 path_max의 초기값으로 사용할 수 있습니다. 따라서 우리는 완전한 구현을 얻습니다.

class Solution {
public:
    int goodNodes(TreeNode* root) {
        return dfs(root,INT_MIN);
    }

    void dfs(TreeNode* root, int path_max) {
        if(root == nullptr){
            return 0;
        }
        int res = 0;
        if(root->val >= path_max){
            res++;
            path_max = root->val;
        }
        res += dfs(root->left, path_max);
        res += dfs(root->right, path_max);
        return res;
    }
};

추천

출처blog.csdn.net/Mamong/article/details/132496104