题目链接
英文链接:https://leetcode.com/problems/populating-next-right-pointers-in-each-node-ii/
中文链接:https://leetcode-cn.com/problems/populating-next-right-pointers-in-each-node-ii/
题目详述
给定一个二叉树
1 | struct Node { |
填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL
。
初始状态下,所有 next 指针都被设置为 NULL
。
示例:
1 | 输入:{"$id":"1","left":{"$id":"2","left":{"$id":"3","left":null,"next":null,"right":null,"val":4},"next":null,"right":{"$id":"4","left":null,"next":null,"right":null,"val":5},"val":2},"next":null,"right":{"$id":"5","left":null,"next":null,"right":{"$id":"6","left":null,"next":null,"right":null,"val":7},"val":3},"val":1} |
提示:
- 你只能使用常量级额外空间。
- 使用递归解题也符合要求,本题中递归程序占用的栈空间不算做额外的空间复杂度。
题目详解
本题是 LeetCode116-填充每个节点的下一个右侧节点指针 的进阶版。LeetCode116-填充每个节点的下一个右侧节点指针 给出的树是完美二叉树,而本题不是,属于更普遍的情况。两者思路是一致的,都是从根结点开始进行层次遍历,只不过在连接下一层结点时有所不同。
- 从根节点开始进行广度优先搜索,每次遍历一层结点。
- 遍历时维护下一层结点的链表。对于每个结点,依次判断它的左孩子和右孩子是否存在。如果存在,则添加到链表的末尾。为了方便操作,新建一个 dummy 结点作为头结点。
- 每当遍历完这一层时,代表下一层的结点已经通过
next
指针链接起来了。进入下一层就可以重复这样操作。 - 由于
next
指针的存在,可以只使用常量级额外空间来进行搜索,空间复杂度为O(1)
。
1 | public class LeetCode_00117 { |