Leetcode117. 填充每个节点的下一个右侧节点指针 II
题目描述
/**
* 给定一个二叉树
*
* 填充它的每个 next 指针,让这个指针指向其下一个右侧节点。
* 如果找不到下一个右侧节点,则将 next 指针设置为 NULL。
*
* 初始状态下,所有 next 指针都被设置为 NULL。
*
*/
思路分析
- 填充每个节点的下一个节点,即二叉树的每个节点多了一个next指针,将每一层节点的next指针指向当前层的右侧节点,最右侧节点置为空
- 使用广度优先的思想,逐层遍历每一层节点,使用一个辅助队列保存每一层的节点
- 使用双层循环,外层循环控制对整棵树的遍历,内层循环控制对每一层节点的遍历
- 判断当前层节点是否是最右边的一个,如果不是,则将其next指针指向当前层右侧节点,如果是,则将其置空
- 然后再判断当前层的下一层是否还有节点,如果有,则入队列,继续相同的操作,直到整棵树都被遍历完
- 详解见下
源码及分析
/**
* @param root 二叉树根节点
* @return
*/
public Node connect(Node root) {
//数据校验
if (root == null) {
return root;
}
//创建队列用于保存每一层的节点
Queue<Node> queue = new LinkedList<>();
//先将根节点入队列
queue.offer(root);
//外层循环控制遍历所有层的节点
while (!queue.isEmpty()) {
//记录当前层的节点个数
int size = queue.size();
//遍历当前层节点
for (int i = 0; i < size; i++) {
//取出第一个节点
Node node = queue.poll();
//如果取出的节点不是当前层最右边的节点,则将其next指针指向其右侧节点
if (i < size - 1) {
node.next = queue.peek();
}
//若下一层节点不为空,则将下一层节点入队列,重复上述步骤
if (node.left != null) {
queue.offer(node.left);
}
if (node.right != null) {
queue.offer(node.right);
}
}
}
return root;
}