这是我参与11月更文挑战的第4天,活动详情查看:2021最后一次更文挑战
题目
给定一个 完美二叉树 ,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:
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 所示。序列化的输出按层序遍历排列,
同一层节点由 next 指针连接,'#' 标志着每一层的结束。
提示
- 树中节点的数量少于
4096
-1000 <= node.val <= 1000
解题思路
层级遍历,节点关联
由于该树结构中没有上一节点,我们在当前节点所能获取到到只有自身到左节点和右节点,而无法直接获取到兄弟节点。
因此我们必须先通过父节点将其左右节点进行关联。但这种情况只适合一个层级的场景,如果是多级场景,我们还需要将当前节点的右节点关联只下一节点的左节点,那么这时就无法通过父节点直接进行关联了。
这时我们应该怎么做呢?考虑到该右节点需要进行关联到场景,那么其父节点必定为已关联下一兄弟节点,我们能否利用这一特性做点啥呢?
通过父节点到下一节点,我可以直接获取到其左节点,此时,我们即可将该右节点与其进行关联,示例代码为:
node.right = node.next.left
最终我们实现到效果如下:
- 现将当前节点到左节点与右节点关联;
- 再获取下一节点到左节点,将右节点与其进行关联。
class Solution {
public Node connect(Node root) {
Node head = root;
while(null != head){
Node node = head;
while(null != node){
// 左节点不为空,则关联右节点
if(null != node.left){
node.left.next = node.right;
}
// 右节点不为空,并且下一节点不为空,则将右节点关联下一节点到左节点
if(null != node.right && null != node.next){
node.right.next = node.next.left;
}
// 指针后移,反复执行关联操作
node = node.next;
}
// 指针跳转到下一行首位元素
head = head.left;
}
// 返回结果
return root;
}
}
复杂度分析
- 时间复杂度:
- 空间复杂度:
最后
文章有写的不好的地方,请大佬们不吝赐教,错误是最能让人成长的,愿我与大佬间的距离逐渐缩短!
如果觉得文章对你有帮助,请 点赞、收藏、关注、评论 一键四连支持,你的支持就是我创作最大的动力!!!