Leetcode:Populating Next Right Pointers in Each Node 두 갈래 트리 채우기 next 포인터

4216 단어 LeetCode
Populating Next Right Pointers in Each Node :
populating-next-right-pointers-in-each-node-ii :
Given a binary tree
struct TreeLinkNode {
      TreeLinkNode *left;
      TreeLinkNode *right;
      TreeLinkNode *next;
}

Populate each next pointer to point to its next right node. If there is no next right node, the next pointer should be set to  NULL .
Initially, all next pointers are set to  NULL .
 
문제 풀이 분석:
1번 문제는 2번 문제의 특례입니다. 2번 코드는 아무런 변경도 하지 않고 accepted 1번 문제를 받아들일 수 있습니다.
그러나 첫 번째 문제는 O(1) 공간이 필요하고 두 갈래 나무로 귀속시키면 된다
 
먼저 두 번째 문제를 완성하려면 두 갈래 나무의 각 층의 결점의next바늘을 채워야 한다. 여기에 층계의 개념이 하나 있는데 두 갈래 나무의 층계가 두루 돌아다니는 것을 먼저 생각해야 한다.
모든 층에 대해 우리는 모든 결점의next를 서열의 후계 결점을 가리키고, 모든 층의 마지막 결점의next 바늘을 NULL로 설정하면 된다는 것을 쉽게 생각할 수 있다.
두 갈래 나무의 층계가 두루 다니면 아주 능숙하게 쓸 수 있을 것이다
class Solution {
public:
    void connect(TreeLinkNode *root) {
        if (root == NULL) return;
        vector<vector<TreeLinkNode*>> result;
        levelOrder(root, 1, result);
        for (int i = 0; i < result.size(); ++i) {
            for (int j = 0; j < result.at(i).size(); ++j) {
                if (j != result.at(i).size() - 1) {
                    result.at(i).at(j)->next = result.at(i).at(j+1);
                } else {
                    result.at(i).at(j)->next = NULL;
                }
            }
        }
    }
    
    void levelOrder(TreeLinkNode* root, int level, vector<vector<TreeLinkNode*>>& result) {
        if (root == NULL) return;
        if (level > result.size()) {
            result.push_back(vector<TreeLinkNode*>());
        }
        result.at(level-1).push_back(root);
        levelOrder(root->left, level + 1, result);
        levelOrder(root->right, level + 1, result);
    }
};

좋은 웹페이지 즐겨찾기