填充每个节点的下一个右侧节点指针-116
填充每个节点的下一个右侧节点指针
题目:填充每个节点的下一个右侧节点指针
给定一个 完全二叉树,二叉树定义如下:
struct Node {
int val;
Node *left;
Node *right;
Node *next;
}
填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。
初始状态下,所有 next 指针都被设置为 NULL。
实例:
输入:root = [1,2,3,4,5,6,7]
输出:[1,#,2,3,#,4,5,6,7,#]
题解:
1. BFS
利用BFS,层次遍历每一层,当前节点的next等于队列中的下一个节点
时间复杂度:10%, 空间复杂度:10%
class Solution {
public Node connect(Node root) {
Queue<Node> queue=new LinkedList<>();
if(root == null) return root;
queue.add(root);
while (!queue.isEmpty())
{
int l=queue.size();
for(int i=0;i<l;i++)
{
Node temp=queue.poll();
if(i!=l-1)
{
temp.next=new Node();
temp.next=queue.peek();
}
else
temp.next=null;
if(temp.left!=null)
queue.add(temp.left);
if(temp.right!=null)
queue.add(temp.right);
}
}
return root;
}
}
2. 递归
左节点.next=父节点.right
右节点.next=父节点.next.left
class Solution {
public void dfs(Node root)
{
if(root==null || root.left==null) return;
root.left.next=root.right;
if(root.next!=null)
root.right.next=root.next.left;
dfs(root.left);
dfs(root.right);
}
public Node connect(Node root) {
if(root==null) return root;
root.next=null;
dfs(root);
return root;
}
}