LeetCode116. 填充每个节点的下一个右侧节点指针
题目描述
/**
* 给定一个 完美二叉树 ,其所有叶子节点都在同一层,每个父节点都有两个子节点
*
* 填充它的每个 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;
}