题目

给定一个 完美二叉树,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:

  1. struct Node {
  2. int val;
  3. Node *left;
  4. Node *right;
  5. Node *next;
  6. }

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

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

示例:

image.png

方案一(层序遍历,广度优先搜索)

"""
# 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
"""
def connect(root: 'Node') -> 'Node':
    if not root:
        return None
    queue = [root]
    while queue:
        length = len(queue)
        for i in range(length):
            if i != length - 1:
                queue[i].next = queue[i + 1]
            if queue[i].left:
                queue.append(queue[i].left)
            if queue[i].right:
                queue.append(queue[i].right)
        queue = queue[length:]
    return root

换一个写法

"""
# 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 not root:
            return None

        deque = collections.deque([root])
        while deque:
            length = len(deque)
            self.connect_one_layer(deque)
            for i in range(length):
                node = deque.popleft()
                if node.left:
                    deque.append(node.left)
                if node.right:
                    deque.append(node.right)
        return root

    def connect_one_layer(self, nodes):
        for i in range(len(nodes) - 1):
            nodes[i].next = nodes[i + 1]

方案二(递归)

"""
# 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
"""
def connect(root: 'Node') -> 'Node':
    if not root:
        return None

    # 将 2,4,5 -> 3,6,7 看成一个整体
    left = root.left
    right = root.right
    while left:
        left.next = right
        # 连接上图中 5 -> 6 之间的指针
        left = left.right
        right = right.left

    self.connect(root.left)
    self.connect(root.right)
    return root
  • 最主要的点是如何连接上图中的 5 -> 6 之间的指针;
  • 如何将问题分解成相同的子问题是递归的关键;

原文