---
# System prepended metadata

title: 116. Populating Next Right Pointers in Each Node
tags: [tree, Leetcode, medium, python]

---

###### tags: `Leetcode` `medium` `tree` `python`

# 116. Populating Next Right Pointers in Each Node

## [題目連結:] https://leetcode.com/problems/populating-next-right-pointers-in-each-node/

## 題目:
You are given a **perfect binary tree** where all leaves are on the same level, and every parent has two children. The binary tree has the following definition:
```
struct Node {
  int val;
  Node *left;
  Node *right;
  Node *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```.

![](https://i.imgur.com/i48S2Hs.png)
![](https://i.imgur.com/7AwjgEl.png)

#### [圖片來源:]https://leetcode.com/problems/populating-next-right-pointers-in-each-node/

## 解題想法:

* 題目為要求把一顆完全二元樹的每層node之間順序連接
* Recursive:
    * root開始逐一處理下一層
    * 將root.left指向root.right
        * 即root.left.next=root.right
    * 特別注意，若當前root，有next:
        * 表示下層需連結兩個子樹:
            * 當前root.left連上當前root.right
            * 當前root.right須連上當前root.next.left
* 示意流程:
```
          1 root
    2    -->     3    root.left.next(2) = root.right(3) 
4       5   6       7  

          1 
    2 root -->     3   
4  ->  5   6       7  
root.left.next(4) = root.right(5)

          1 
    2 root -->     3   
4  ->  5  ->>>> 6       7  
if root.next:
    root.right.next(5)=root.next.left(6)
```

* 同類型題目: [117. Populating Next Right Pointers in Each Node II](/81N3AmEtQgKSrSKSuNqSTw)
    * 為使用pointer，讓space: O(1)

## Python:
``` python=
class Node(object):
    def __init__(self, val=0, left=None, right=None, next=None):
        self.val = val
        self.left = left
        self.right = right
        self.next = next
    def insertLeft(self,node):
        if self.left==None:
            self.left=Node(node)
        else:
            self.left.insertLeft(node)
    def insertRight(self,node):
        if self.right==None:
            self.right=Node(node)
        else:
            self.right.insertRight(node)
    def printTree(self):
        root=self
        stack=[root]
        res=[]
        while stack:
            root=stack.pop(0)
            res.append(root.val)
            if root.left:
                stack.append(root.left)
            if root.right:
                stack.append(root.right)
        print(res)

class Solution(object):
    def connect(self, root):
        """
        :type root: Node
        :rtype: Node
        """
        if not root:
            return None
        #判斷是否有右子即可:
        #因為完全二元樹，有右子代表一定要先有左子
        if root.right:
            root.left.next=root.right #將下層自己的左子連右子
            if root.next: #若該root還有同層next
                root.right.next=root.next.left #將下層自己的右子連自己next的左子
        self.connect(root.left)
        self.connect(root.right)
        return root      

root = Node(1)
root.insertLeft(2)
root.insertRight(3)
root.left.insertLeft(4)
root.left.insertRight(5)
root.right.insertLeft(6)
root.right.insertRight(7)
root.printTree()

result = Solution()
ans = result.connect(root)
root.printTree()
```