leetcode-116:填充每个节点的下一个右侧节点指针

LC 填充每个节点的下一个右侧节点指针

  • 题目
  • 解题
    • 方法一:广度优先搜索(BFS)

题目

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

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

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

进阶:

  • 你只能使用常量级额外空间。
  • 使用递归解题也符合要求,本题中递归程序占用的栈空间不算做额外的空间复杂度。

示例:
leetcode-116:填充每个节点的下一个右侧节点指针_第1张图片

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

解题

方法一:广度优先搜索(BFS)

利用层序遍历,每层的第一个节点,指向第二个,第二个指向第三个,最后一个节点,指向None。用i来控制到第几个节点了

"""
# 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 root
        queue = [root]
        while queue:
            l = len(queue)
            for i in range(l):
                cur = queue.pop(0)
                left,right = cur.left,cur.right
                if i==l-1:
                    cur.next=None
                else:
                    cur.next=queue[0]
                if left:
                    queue.append(left)
                    queue.append(right)        
        return root

由于,是完全二叉树,每个节点都有一个左子节点和右节点,因此,if left后直接加入左右子节点就行了。节点的next默认为None,但为了清晰思路,还是写了一遍,其实i的时候cur.next=queue[0]更为简洁。

你可能感兴趣的:(python-leetcode,二叉树,算法,leetcode,数据结构,python)