116. 填充每个节点的下一个右侧节点指针 二叉树 逆序BFS O(n)/ 利用 father.next遍历下层节点 O(1)

思路:

  法1. 本题逆序BFS,从右到左记录每一个level的visited, 但是这样就用了O(n)的额外空间

  法2.  官答

    1) 左子节点永远指向右子节点

    2)右子节点指向 None或者 父节点相邻节点的左子节点

      if fatherNode.next:  fatherNode.right.next = fatherNode.next.left

难点:

  1)本题没想到的地方就是,利用上层节点.next的操作,能遍历完整的下层节点,这样就完成对右节点.next的赋值

代码:

"""
# 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
"""
法1)
class Solution:
    def connect(self, root: 'Node') -> 'Node':
        visited = []
        def helper(node,level):
            if not node:
                return 
            if len(visited) == level:
                visited.append([])
                node.next = None
            else:
                node.next = visited[level][0]
                visited[level].pop()
            visited[level].append(node)
            helper(node.right,level+1)
            helper(node.left,level+1)
        helper(root,0)
        return root            

法2) 

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

        leftMost = root
        while leftMost.left:
            point = leftMost
            while point:
                # 对某节点,连接其左右子节点
                point.left.next = point.right
                # 如果其右边还有节点
                if point.next:
                    point.right.next = point.next.left
                else:
                    point.right.next = None
                point = point.next

            leftMost=leftMost.left
        return root
原文地址:https://www.cnblogs.com/ChevisZhang/p/12915931.html