提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
题目描述
给定一个 完美二叉树 ,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:
struct Node {
int val;
Node *left;
Node *right;
Node *next;
}
填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。
初始状态下,所有 next 指针都被设置为 NULL。
解题过程
解题思路
利用队列的先进先出原则,将每层的节点依次入队。再用一个循环遍历队列中的每一个节点,更新next的值。
1、创建FIFO的队列,并将根节点入队;
2、while循环,循环结束的条件是队列为空;
3、while循环中,创建list列表用于保存一层遍历的结果;
4、while循环中,计算当前队列中的元素个数size;
5、while循环中,用一个for循环遍历size大小的队列,每一个被遍历到的节点,更新next的指向,同时查看该节点是否存在左、右子节点,若存在则入队,入队顺序是先左后右;
6、while循环结束,返回res;
代码如下:
/*
// 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 length = queue.size();
for(int i = 0; i < length; i++){
Node node = queue.poll();
if(i == length - 1){//队列到头了,表示当前节点没有next可用,next要指向空
;//node.next = null;
}else{
node.next = queue.peek();//前面已经出过队了,这时队头就是所需要的next指向
}
//要更新队列
if(node.left != null){
queue.offer(node.left);
}
if(node.right != null){
queue.offer(node.right);
}
}
}
return root;
}
}
总结
暂时没有总结,待续。。。