"""
符合要求，本题中递归程序占用的栈空间不算做额外的空间复杂度。
 

示例：



输入：root = [1,2,3,4,5,6,7]
输出：[1,#,2,3,#,4,5,6,7,#]
解释：给定二叉树如图 A 所示，你的函数应该填充它的每个 next 指针，以指向其下一个右侧节点，如图 B 所示。序列化的输出按层序遍历排列，同一层节点由 next 指针连接，'#' 标志着每一层的结束。
 

提示：

树中节点的数量少于 4096
-1000 <= node.val <= 1000
通过次数120,418提交次数172,996

来源：力扣（LeetCode）
链接：https://leetcode-cn.com/problems/populating-next-right-pointers-in-each-node
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
"""

# Definition for a Node.
class Node:
    def __init__(self, val: int = 0, left=None, right=None, next=None):
        self.val = val
        self.left = left
        self.right = right
        self.next = next

# 使用后续遍历：先将子树的节点连接起来，然后迭代让左子树最右侧的节点和右子树最左侧的节点连接即可。

class Solution:
    def connect(self, root: Node) -> Node:
        if not root:
            return None

        root.left = self.connect(root.left)
        root.right = self.connect(root.right)

        left, right = root.left, root.right
        while left:
            left.next = right
            left, right = left.right, right.left

        return root
