题目链接
填充每个节点的下一个右侧节点指针 II
题目描述
注意点
- 初始状态下,所有 next 指针都被设置为NULL
- 如果找不到下一个右侧节点,则将 next 指针设置为NULL
解答思路
- 首先想到的是层序遍历,将每一层的节点存储在队列中,根据队列先进先出的特点将节点弹出并指向下一个节点
- 参照题解可以利用已有的next进行层序遍历而不需要使用额外O(n)的空间存储每一层的节点,思路为:根据next指针遍历第i层时,可以根据将该层节点的左右子树从左到右更新第i + 1层的next指针,同时存储第i + 1层的第一个节点,方便下一层进行遍历
代码
方法一:
class Solution {public Node connect(Node root) {if (root == null) {return root;}Node res = root;Deque<Node> deque = new ArrayDeque<>();deque.offerFirst(root);while (!deque.isEmpty()) {int len = deque.size();for (int i = 0; i < len; i++) {Node node = deque.pollLast();if (node.left != null) {deque.offerFirst(node.left);}if (node.right != null) {deque.offerFirst(node.right);}node.next = (i < len - 1) ? deque.peekLast() : null;}}return res;}
}
方法二:
class Solution {public Node connect(Node root) {if (root == null) {return root;}Node res = root;// 最初指向每一层的第一个节点,遍历每层所有节点Node node = root;while (node != null) {// 下一层的第一个节点Node nextFirstNode = null;Node nextNode = new Node();while (node != null) {if (nextFirstNode == null) {nextFirstNode = node.left != null ? node.left : node.right;}if (node.left != null) {nextNode.next = node.left;nextNode = nextNode.next;}if (node.right != null) {nextNode.next = node.right;nextNode = nextNode.next;}node = node.next;}node = nextFirstNode;}return res;}
}
关键点
- 层序遍历的过程
- 注意节点为null的判断