题目:leetcode117. 填充每个节点的下一个右侧节点指针 II
描述
给定一个二叉树 ,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:
struct Node {
int val;
Node *left;
Node *right;
Node *next;
}
填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。
初始状态下,所有 next 指针都被设置为 NULL。
思路
还是二叉树的层次遍历,使用队列来进行层次遍历,在遍历每一层的时候,先将第一个节点放入left,然后再循环依次取出剩下的结点,取出一个节点就放入right,每次都要left的next指针指向right。(这里跟第116题不同的是,这道题是二叉树,第116题是完美二叉树,但是使用队列来解决两者都是可以使用完全一样的代码,因为队列压入数据和弹出数据不在乎你是左节点还是右节点,只要是同一层的节点就可以)
代码
import java.util.Deque;
import java.util.LinkedList;
public class Solution{
public Node connect(Node root) {
if(root==null)
return root;
Deque<Node> deque=new LinkedList<>();
int length;
deque.offer(root);
while(!deque.isEmpty())
{
length=deque.size();
Node left = deque.poll();
length--;
if(left.left!=null)
deque.offer(left.left);
if(left.right!=null)
deque.offer(left.right);
while (length >0) {
Node right = deque.poll();
if(right!=null) {
if (right.left != null)
deque.offer(right.left);
if (right.right != null)
deque.offer(right.right);
}
left.next=right;
left=right;
length--;
}
}
return root;
}
}