给定一个二叉树
struct Node {
int val;
Node *left;
Node *right;
Node *next;
}
填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。
初始状态下,所有 next 指针都被设置为 NULL。
题解(一):BFS层序遍历,维护一个队列,遍历二叉树,由于BFS是以层为序遍历二叉树的,在遍历完第n层前,一定会遍历第n-1层。所以我们只需要利用循环在队列中提取出每一层的所有元素,令被提取的当前元素的next指针指向当前队列头元素。
class Solution {
public Node connect(Node root) {
if(root==null)
return null;
Queue<Node>BFS=new LinkedList<>();
BFS.offer(root);
while(!BFS.isEmpty()){
int size=BFS.size();
for(int i=0;i<size;i++){
Node temp=BFS.poll();
if(i!=size-1)
temp.next=BFS.peek();
if(temp.left!=null)
BFS.add(temp.left);
if(temp.right!=null)
BFS.add(temp.right);
}
}
return root;
}
}
题解(二):由于next指针的存在,我们不需要队列就可以实现遍历每层二叉树,具体做法就是在遍历第n层时连接第n+1层的next指针(利用每个节点的left、right指针操作第n+1层),然后在第n+1层指针的第一个元素做一个标记,再遍历完第n层后遍历第n+1层。
class Solution {
/**
* {@code nextStart}用于记录当前遍历二叉树层的下一层的第一个元素
* {@code last}用于{@code next}指针的连接
*/
private Node nextStart=null;
private Node last=null;
public Node connect(Node root) {
Node start=root;
while(start!=null){
nextStart=null;
last=null;
Node move=start;
while(move!=null){
if(move.left!=null)
getNext(move.left);
if(move.right!=null)
getNext(move.right);
move=move.next;
}
start=nextStart;
}
return root;
}
private void getNext(Node node){
if(last!=null)
last.next=node;
if(nextStart==null)
nextStart=node;
last=node;
}
}