题目大意:
填充每个节点的下一个右侧节点指针
给定一个完美二叉树,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:
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,#] 解释:给定二叉树如图 A 所示,你的函数应该填充它的每个 next 指针,以指向其下一个右侧节点,如图 B 所示。
提示:
- 你只能使用常量级额外空间。
- 使用递归解题也符合要求,本题中递归程序占用的栈空间不算做额外的空间复杂度。
如果想查看本题目是哪家公司的面试题,请参考以下免费链接: https://leetcode.jp/problemdetail.php?id=116
解题思路分析:
之前的文章多次提到过,看到二叉树问题,多数要考虑使用dfs或者bfs来解题,本题又是一道这样的题目,这里我们介绍dfs和bfs两种解法来解题。
解法一:dfs深度优先搜索
题目要求将树中的每一个节点与其处于同层的右侧相邻节点连接,那么毫无疑问,当前节点的左子节点应该指向其右子节点,而右子节点则应该指向当前节点相邻右侧节点的左子节点。用上面题目的例子来说明,如果当前节点是2,他的左子节点4应该指向他的右子节点5,而右子节点5应该指向当前节点2的右侧节点3的左子节点6。即:
node.left.next = node.right node.right.next = node.next.left
实现代码:
public Node connect(Node root) {
dfs(root); // dfs每个节点
return root; // 返回root
}
void dfs(Node current){
// 如果当前节点为空,或者当前节点是叶子节点,返回
if(current==null||current.left==null) return;
// 当前节点的左子节点指向其右子节点
current.left.next=current.right;
// 如果当前节点的next不为空
// 当前节点的右子节点指向当前节点next的左子节点
if(current.next!=null) current.right.next=current.next.left;
// 递归左子节点
dfs(current.left);
// 递归右子节点
dfs(current.right);
}本解法执行时间为0ms。
Runtime: 0 ms, faster than 100.00% of Java online submissions for Populating Next Right Pointers in Each Node.
Memory Usage: 50.2 MB, less than 6.35% of Java online submissions for Populating Next Right Pointers in Each Node.
解法二:bfs广度优先搜索
bfs的特性在于能够一行一行的遍历二叉树,每遍历出一行节点,我们按顺序将其一一相连即可。
实现代码:
public Node connect(Node root) {
// 根节点为空,返回空
if(root==null) return null;
// bfs用的queue
Queue<Node> q = new LinkedList<>();
// 将根节点加入Queue
q.offer(root);
// bfs遍历每一个点
while(q.size()>0){
// 当前Queue的元素个数
int size = q.size();
// 当前节点左侧节点,默认为空
Node left=null;
// 循环二叉树每一行
while(size>0){
// 取出一个节点
Node n = q.poll();
// 当前行节点数减一
size--;
// 如果左侧节点不为空,将左侧节点的next指向当前节点
if(left!=null) left.next=n;
// 将当前节点更新为左侧节点
left=n;
// 如果存在子节点,将子节点加入Queue
if(n.left!=null){
q.offer(n.left);
q.offer(n.right);
}
} // 当前行遍历结束
}
return root;
}本解法执行时间为6ms。
Runtime: 6 ms, faster than 6.60% of Java online submissions for Populating Next Right Pointers in Each Node.
Memory Usage: 49.6 MB, less than 6.35% of Java online submissions for Populating Next Right Pointers in Each Node.
本网站文章均为原创内容,并可随意转载,但请标明本文链接如有任何疑问可在文章底部留言。为了防止恶意评论,本博客现已开启留言审核功能。但是博主会在后台第一时间看到您的留言,并会在第一时间对您的留言进行回复!欢迎交流!
本文链接: https://leetcode.jp/leetcode-116-populating-next-right-pointers-in-each-node-解题思路分析/