[LeetCode]116. 填充每个节点的下一个右侧节点指针(java实现)
1. 题目
2. 读题(需要重点注意的东西)
思路1(层次遍历,空间复杂度为O(n)):
这是一棵完美二叉树,它的最后一个层级包含 N/2 个节点。广度优先遍历的复杂度取决于一个层级上的最大元素数量。这种情况下空间复杂度为 O(N)
层次遍历,用队列存储每层的节点,每次遍历的时候用p指针指向当前节点:
-
遍历前n-1个节点,p.next = queue.peek();
-
遍历到最后一个节点,需要单独将其next指针置为null,然后将其左右子树加入队列中
思路2(活用next指针):
观察题意,我们得到:
-
当前节点的左儿子的next指针指向当前节点的右儿子;即
cur.left.next = cur.right;
-
当前节点的右儿子的next指针指向当前节点的next节点的左儿子;
cur.right.next = cur.next.left
(如果当前节点的next为null,则当前节点的右儿子的next也为null)
因此,初始化next指针后,便不需要队列来进行层次遍历了,空间复杂度便优化为O(1)。
3. 解法
---------------------------------------------------解法1---------------------------------------------------:
/*
// Definition for a Node.
class Node {
public int val;
public Node left;
public Node right;
public Node next;
public Node() {}
public Node(int _val) {
val = _val;
}
public Node(int _val, Node _left, Node _right, Node _next) {
val = _val;
left = _left;
right = _right;
next = _next;
}
};
*/
class Solution {
public Node connect(Node root) {
if(root == null) return root;
Queue<Node> queue = new LinkedList<>();
queue.offer(root);
while(!queue.isEmpty()){
int k = queue.size();
for(int i = 0;i < k - 1;i++){
Node p = queue.poll();
p.next = queue.peek();
if(p.left != null) queue.offer(p.left);
if(p.right != null) queue.offer(p.right);
}
// 处理每行最后一个数据
Node p = queue.poll();
p.next = null;
if(p.left != null) queue.offer(p.left);
if(p.right != null) queue.offer(p.right);
}
return root;
}
}
可能存在的问题:
---------------------------------------------------解法2---------------------------------------------------:
/*
// Definition for a Node.
class Node {
public int val;
public Node left;
public Node right;
public Node next;
public Node() {}
public Node(int _val) {
val = _val;
}
public Node(int _val, Node _left, Node _right, Node _next) {
val = _val;
left = _left;
right = _right;
next = _next;
}
};
*/
class Solution {
public Node connect(Node root) {
if(root == null) return root;
Node dummy = root;
// 初始化每一层的next指针
while(root.left != null){
for(Node p = root;p != null; p = p.next){
p.left.next = p.right;
if(p.next != null) p.right.next = p.next.left;
}
root = root.left; // root每次指向的是每层的第一个元素
}
return dummy;
}
}
可能存在的问题:
4. 可能有帮助的前置习题
5. 所用到的数据结构与算法思想
- 层次遍历