填充每一个节点的下一个右侧指针II
难度:中等
题目描述
给定一个二叉树:
struct Node {
int val;
Node *left;
Node *right;
Node *next;
}
填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL
。
初始状态下,所有 next 指针都被设置为 NULL
。
示例1
输入:root = [1,2,3,4,5,null,7]
输出:[1,#,2,3,#,4,5,7,#]
示例2
输入: root = []
输出:[]
题解
可以根据队列解题,将根节点入队,当队内元素不为0
的时候开始循环,定义一个新的空节点,并进行嵌套循环,将节点出队并用temp保存起来,如果该节点的左(右)子树不为空,就将它的左(右)子树入队,如果 i != 1
元素则将出队的节点赋值给空节点的下一个节点,并将空节点移动到下一个
想法代码
public class Node
{
public int val;
public Node left;
public Node right;
public Node next;
public Node(){}
public Node(int _val)
{
val = _val;
}
public Node(int val, Node left, Node right, Node next) : this(val)
{
this.left = left;
this.right = right;
this.next = next;
}
}
public class Solution
{
public static void Main(string[] args)
{
Node root = new Node
{
val = 1,
left = new Node
{
val = 2,
left = new Node(4),
right = new Node(5)
},
right = new Node
{
val = 3,
right = new Node(7)
}
};
Solution solution = new Solution();
}
public Node Connect(Node root)
{
if (root == null)
{
return null;
}
Queue<Node> queue = new Queue<Node>();
queue.Enqueue(root);
while (queue.Count > 0)
{
int n = queue.Count;
Node last = null;
for (int i = 1; i <= n; ++i)
{
Node f = queue.Dequeue();
if (f.left != null)
{
queue.Enqueue(f.left);
}
if (f.right != null)
{
queue.Enqueue(f.right);
}
if (i != 1)
{
last.next = f;
}
last = f;
}
}
return root;
}
}