今天和大家聊的问题叫做 填充每个节点的下一个右侧节点指针 II,我们先来看题面:https://leetcode-cn.com/problems/populating-next-right-pointers-in-each-node-ii/
Populate each next pointer to point to its next right node. If there is no next right node, the next pointer should be set to NULL.Initially, all next pointers are set to NULL.
题意
给定一个二叉树
struct Node { int val; Node *left; Node *right; Node *next; }
填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。
初始状态下,所有 next 指针都被设置为 NULL。
进阶:你只能使用常量级额外空间。使用递归解题也符合要求,本题中递归程序占用的栈空间不算做额外的空间复杂度。
样例
解题
这道题希望我们把二叉树各个层的点组织成链表,一个非常直观的思路是层次遍历。树的层次遍历基于广度优先搜索,它按照层的顺序遍历二叉树,在遍历第 ii 层前,一定会遍历完第 i−1 层。
算法如下:初始化一个队列 q,将根结点放入队列中。当队列不为空的时候,记录当前队列大小为 n,从队列中以此取出 n 个元素并通过这 n 个元素拓展新节点。如此循环,直到队列为空。
class Solution { public Node connect(Node root) { if (root == null) { return null; } Queue<Node> queue = new LinkedList<Node>(); queue.offer(root); while (!queue.isEmpty()) { int n = queue.size(); Node last = null; for (int i = 1; i <= n; ++i) { Node f = queue.poll(); if (f.left != null) { queue.offer(f.left); } if (f.right != null) { queue.offer(f.right); } if (i != 1) { last.next = f; } last = f; } } return root; } }
好了,今天的文章就到这里,如果觉得有所收获,请顺手点个在看或者转发吧,你们的支持是我最大的动力。