---
# System prepended metadata

title: 0117. Populating Next Right Pointers in Each Node II
tags: [Leetcode, BFS, Medium]

---

# 0117. Populating Next Right Pointers in Each Node II
###### tags: `Leetcode` `Medium` `BFS`
## 思路
### 思路一 O(N) O(N)
做BFS层序遍历但是先拿右边的node再拿左边的，这样每次拿到左边的node就会知道它的next是什么，因为会先查看右边的node，再查看左边的
当然也可以正常做BFS，这样每次拿到一个node，它的下一个就是queue.peek（）
### 思路二 O(N) O(1)
之前之所以需要用queue存，是因为对于每一层的任一个node来说，我们都无从知道它的下一个node在哪
但是由于这题会把每一层的node连起来，所以通过root，我们就可以把root的下一层连起来，以此类推，我们可以通过遍历已经连好next的一层node（也就是下面code里面的curr），来把下一层连接起来
当我们发现curr已经是null了，那么就需要进入到下一层，因此我们每次操作的时候都需要记录每一层最左边的node (Node leftMost)

## Code
### 思路一
```java=
class Solution {
    public Node connect(Node root) {
        Queue<Node> q = new LinkedList<>();
        if(root == null) return null;
        q.add(root);
        while(!q.isEmpty()){
            int size = q.size();
            Node prev = null;
            for(int i = 0;i < size;i++){
                Node curr = q.poll();
                if(i == 0){
                    curr.next = null;
                }
                else{
                    curr.next = prev;
                }
                prev = curr;
                if(curr.right!=null) q.add(curr.right);
                if(curr.left!=null) q.add(curr.left);
            }
        }
        return root;
    }
}
```
### 思路二
```java=
class Solution {
    Node leftMost;
    Node prev;
    public void processChild(Node childNode){
        if(leftMost==null){
            leftMost = childNode;
        }
        if(prev!=null){
            prev.next = childNode;
        }
        prev = childNode;
    }
    public Node connect(Node root) {
        if(root == null) return null;
        leftMost = root;
        Node curr;
        while(leftMost!=null){
            prev = null;
            curr = leftMost;
            leftMost = null;
            while(curr!=null){
                if(curr.left!=null)processChild(curr.left);
                if(curr.right!=null)processChild(curr.right);
                
                curr = curr.next;
            }
            
        }
        return root;
    }
}
```