给定一个 完美二叉树 ,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:
struct Node { int val; Node *left; Node *right; Node *next; }填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为
NULL
。初始状态下,所有 next 指针都被设置为
NULL
。示例 1:
输入:root = [1,2,3,4,5,6,7] 输出:[1,#,2,3,#,4,5,6,7,#] 解释:给定二叉树如图 A 所示,你的函数应该填充它的每个 next 指针,以指向其下一个右侧节点,如图 B 所示。序列化的输出按层序遍历排列,同一层节点由 next 指针连接,'#' 标志着每一层的结束。示例 2:
输入:root = [] 输出:[]提示:
- 树中节点的数量在
[0, 212 - 1]
范围内-1000 <= node.val <= 1000
进阶:
- 你只能使用常量级额外空间。
- 使用递归解题也符合要求,本题中递归程序占用的栈空间不算做额外的空间复杂度。
Java 解题及思路:
具体解题思路和下面解题类似,该题目不在详细写解题思路
package com.java.leetcode.tree;
import com.java.leetcode.constant.Node;
import java.util.ArrayDeque;
import java.util.Deque;
/**
* 给定一个 完美二叉树 ,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:
*
* struct Node {
* int val;
* Node *left;
* Node *right;
* Node *next;
* }
* 填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。
*
* 初始状态下,所有 next 指针都被设置为 NULL。
*
*
*
* 示例 1:
*
*
*
* 输入:root = [1,2,3,4,5,6,7]
* 输出:[1,#,2,3,#,4,5,6,7,#]
* 解释:给定二叉树如图 A 所示,你的函数应该填充它的每个 next 指针,以指向其下一个右侧节点,如图 B 所示。序列化的输出按层序遍历排列,同一层节点由 next 指针连接,'#' 标志着每一层的结束。
* 示例 2:
*
* 输入:root = []
* 输出:[]
*
*
* 提示:
*
* 树中节点的数量在 [0, 212 - 1] 范围内
* -1000 <= node.val <= 1000
*
*
* 进阶:
*
* 你只能使用常量级额外空间。
* 使用递归解题也符合要求,本题中递归程序占用的栈空间不算做额外的空间复杂度。
*/
public class connect116 {
/**
* 思路同样为102的变种层序遍历的变种 只需要查看queue的下一个节点是否存在,且是否在size 范围内即可
* @param root
* @return
*/
public Node connect(Node root) {
if(root==null){
return root;
}
Deque<Node> dq=new ArrayDeque<>();
dq.offer(root);
while(!dq.isEmpty()){
int size=dq.size();
while(size>0){
Node node=dq.poll();
size--;
if(size==0){
node.next=null;
}else{
Node next=dq.peek();
node.next=next;
}
if(node.left!=null){
dq.offer(node.left);
}
if(node.right!=null){
dq.offer(node.right);
}
}
}
return root;
}
}