[Leetcode] 86. Populating Next Right Pointers in Each Node II

2180 단어

제목


Follow up for problem "Populating Next Right Pointers in Each Node".
What if the given tree could be any binary tree? Would your previous solution still work?
Note:
You may only use constant extra space.

For example, Given the following binary tree,
     1
   /  \
  2    3
 / \    \
4   5    7

After calling your function, the tree should look like:
     1 -> NULL
   /  \
  2 -> 3 -> NULL
 / \    \
4-> 5 -> 7 -> NULL

문제풀이법

// Recursion, more than constant space
class Solution {
public:
    void connect(TreeLinkNode *root) {
        if (!root) return;
        TreeLinkNode *p = root->next;
        while (p) {
            if (p->left) {
                p = p->left;
                break;
            }
            if (p->right) {
                p = p->right;
                break;
            }
            p = p->next;
        }
        if (root->right) root->right->next = p; 
        if (root->left) root->left->next = root->right ? root->right : p; 
        connect(root->right);
        connect(root->left);
    }
};

분석


이것은 이전의 Populating Next Right Pointers in Each Node 각 노드의 오른쪽 방향 바늘의 연장이다. 원래의 완전한 두 갈래 나무의 조건은 만족하지 않지만 전체적인 사고방식은 여전히 비슷하고 귀속과 비귀속의 해법이 있다.귀속 방법은 하위 나무가 부족할 수 있기 때문에 부모 노드와 같은 층의 노드를 평행으로 스캔하여 그들의 좌우 하위 노드를 찾아야 한다.
다음은 교체하는 방법이다.
// Non-recursion, more than constant space
class Solution {
public:
    void connect(TreeLinkNode *root) {
        if (!root) return;
        queue q;
        q.push(root);
        q.push(NULL);
        while (true) {
            TreeLinkNode *cur = q.front();
            q.pop();
            if (cur) {
                cur->next = q.front();
                if (cur->left) q.push(cur->left);
                if (cur->right) q.push(cur->right);
            } else {
                if (q.size() == 0 || q.front() == NULL) return;
                q.push(NULL);
            }
        }
    }
};

좋은 웹페이지 즐겨찾기