# [117. 填充每个节点的下一个右侧节点指针 II](https://leetcode-cn.com/problems/populating-next-right-pointers-in-each-node-ii) [English Version](/solution/0100-0199/0117.Populating%20Next%20Right%20Pointers%20in%20Each%20Node%20II/README_EN.md) ## 题目描述

给定一个二叉树

struct Node {
  int val;
  Node *left;
  Node *right;
  Node *next;
}

填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。

初始状态下,所有 next 指针都被设置为 NULL。

 

进阶:

 

示例:

输入:root = [1,2,3,4,5,null,7]
输出:[1,#,2,3,#,4,5,7,#]
解释:给定二叉树如图 A 所示,你的函数应该填充它的每个 next 指针,以指向其下一个右侧节点,如图 B 所示。序列化输出按层序遍历顺序(由 next 指针连接),'#' 表示每层的末尾。

 

提示:

 

## 解法 “BFS 层次遍历”实现。 ### **Python3** ```python """ # Definition for a Node. class Node: def __init__(self, val: int = 0, left: 'Node' = None, right: 'Node' = None, next: 'Node' = None): self.val = val self.left = left self.right = right self.next = next """ class Solution: def connect(self, root: 'Node') -> 'Node': if root is None or (root.left is None and root.right is None): return root q = collections.deque([root]) while q: size = len(q) cur = None for _ in range(size): node = q.popleft() if node.right: q.append(node.right) if node.left: q.append(node.left) node.next = cur cur = node return root ``` ### **Java** ```java /* // Definition for a Node. class Node { public int val; public Node left; public Node right; public Node next; public Node() {} public Node(int _val) { val = _val; } public Node(int _val, Node _left, Node _right, Node _next) { val = _val; left = _left; right = _right; next = _next; } }; */ class Solution { public Node connect(Node root) { if (root == null || (root.left == null && root.right == null)) { return root; } Deque q = new ArrayDeque<>(); q.offer(root); while (!q.isEmpty()) { Node cur = null; for (int i = 0, n = q.size(); i < n; ++i) { Node node = q.pollFirst(); if (node.right != null) { q.offer(node.right); } if (node.left != null) { q.offer(node.left); } node.next = cur; cur = node; } } return root; } } ``` ### **C++** ```cpp /* // Definition for a Node. class Node { public: int val; Node* left; Node* right; Node* next; Node() : val(0), left(NULL), right(NULL), next(NULL) {} Node(int _val) : val(_val), left(NULL), right(NULL), next(NULL) {} Node(int _val, Node* _left, Node* _right, Node* _next) : val(_val), left(_left), right(_right), next(_next) {} }; */ class Solution { public: Node* connect(Node* root) { if (!root || (!root->left && !root->right)) { return root; } queue q; q.push(root); while (!q.empty()) { Node* cur = nullptr; for (int i = 0, n = q.size(); i < n; ++i) { Node* node = q.front(); q.pop(); if (node->right) { q.push(node->right); } if (node->left) { q.push(node->left); } node->next = cur; cur = node; } } return root; } }; ``` ### **...** ``` ```