题目
给定一个 完美二叉树 ,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:
struct Node {
int val;
Node *left;
Node *right;
Node *next;
}
填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。
初始状态下,所有 next 指针都被设置为 NULL。
进阶:
你只能使用常量级额外空间。
使用递归解题也符合要求,本题中递归程序占用的栈空间不算做额外的空间复杂度。
提示:
树中节点的数量少于 4096
-1000 <= node.val <= 1000
思路
将其进行一个层序遍历,每次都将当前层的所有节点存放进队列中,然后依次去取出来,并且给他们的next指针赋值即可!
代码
class Solution {
public Node connect(Node root) {
Node copy = root;
if(root==null)
{
return null;
}
// 进行一次层次遍历
Deque <Node> deque = new LinkedList<>();
deque.add(root);
while(!deque.isEmpty())
{
int size=deque.size();
for(int i=0;i<size;++i)
{
Node temp_1 = deque.poll();
Node temp_2 = deque.peek(); // 获得首个元素,不会移除首个元素,如果队列是空的就返回null
// 因为可能获取到下层节点,所以在最后要进行一个判断,如果是这样,就将其赋值为空,防止获取到下层节点
if(i==size-1)
temp_2=null;
temp_1.next=temp_2;
if(temp_1.left!=null)
deque.add(temp_1.left);
if(temp_1.right!=null)
deque.add(temp_1.right);
}
}
return copy;
}
}
结果
想不到如何使用常量级的额外空间!