说人话:为二叉树增加next指针。
方法一:
利用队列进行层序遍历,遍历的同时修改next指针。
时空都是O(N)
class Solution { //队列 + 层序遍历
public Node connect(Node root) {
if(root == null) return root;
Queue<Node> queue = new LinkedList<Node>();
queue.offer(root);
while(!queue.isEmpty()){
int curLevelSize = queue.size();
for(int i = 0; i < curLevelSize; i++){
Node node = queue.poll();
if(node.left != null) queue.offer(node.left);
if(node.right != null) queue.offer(node.right);
if(i == curLevelSize - 1){
node.next = null;
}
else{
node.next = queue.peek();
}
}
}
return root;
}
}
方法二:
next指针有两种情况:
①同父亲 head.left.next = head.right;
②不同父亲 head.right.next = head.next.left;
优化空间复杂度到O(1)。
class Solution {
public Node connect(Node root) {
if(root == null) return root;
Node leftStart = root;
while(leftStart.left != null){ //从根的下一层开始处理,统一逻辑
Node head = leftStart;
while(head != null){
head.left.next = head.right; //第一种连接
if(head.next != null) head.right.next = head.next.left; //第二种连接
head = head.next; //处理head右边节点的下一层节点
}
leftStart = leftStart.left;
}
return root;
}
}
解法:
待补充》》》》》