[일일 알고리즘 Day 108] 간단한 두 갈래 나무 제목인데 쓰는 방법이 꽤 많아요.

7421 단어

제목 링크


LeetCode 199. 두 갈래 나무의 오른쪽 보기 [1]

제목 설명


두 갈래 나무를 정해서 오른쪽에 서 있는 것을 상상하고 꼭대기에서 끝까지 순서대로 오른쪽에서 볼 수 있는 노드 값을 되돌려줍니다.
예제 1
         :
[1,2,3,null,5,null,4]
 :
[1,3,4]
 :
   1            
      

풀다

dfs

dfs , 。

, 。 , 。

, , , 。

bfs

bfs 。 , 。

bfs , ? pair 깊이 값을 하나 더 저장하지만, 이렇게 하면 좀 쓸데없다.
우리는 매번 대기열에 같은 층의 결점만 저장하고 대기열의 크기를 기록하기만 하면 된다.그리고 순서대로 출대해서 출대 개수가 이전에 기록한 크기에 도달할 때까지 한다.그리고 모든 다음 결점을 동시에 팀에 넣는다.이렇게 하면 이 층의 결점이 모두 출대된 후에 대열에 다음 층의 결점만 남았다는 것을 보장할 수 있다.

코드


dfs(c++)

        class Solution {
public:
    vector<int> rightSideView(TreeNode* root) {
        if (!root) return {};
        vector<int> left = rightSideView(root->left);
        vector<int> right = rightSideView(root->right);
        vector<int> res = {root->val};
        for (auto x : right) res.push_back(x);
        for (int i = right.size(), sz = left.size(); i < sz; ++i) {
            res.push_back(left[i]);
        }
        return res;
    }
};

      

bfs(c++)

        class Solution {
public:
    vector<int> rightSideView(TreeNode* root) {
        vector<int> res;
        queue<TreeNode*> Q;
        if (root) Q.push(root);
        while (!Q.empty()) {
            int sz = Q.size();
            while (sz--) {
                TreeNode* node = Q.front();
                Q.pop();
                if (!sz) res.push_back(node->val);
                if (node->left) Q.push(node->left);
                if (node->right) Q.push(node->right);
            }
        }
        return res;
    }
};

      

참고 자료


[1]
LeetCode 199. 두 갈래 나무의 오른쪽 보기:https://leetcode-cn.com/problems/binary-tree-right-side-view/

좋은 웹페이지 즐겨찾기