给定一个二叉树
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,#] 解释:给定二叉树如图 A 所示,你的函数应该填充它的每个 next 指针,以指向其下一个右侧节点,如图 B 所示。序列化输出按层序遍历顺序(由 next 指针连接),'#' 表示每层的末尾。
示例 2:
输入:root = [] 输出:[]
提示:
- 树中的节点数在范围
[0, 6000]
内 -100 <= Node.val <= 100
进阶:
- 你只能使用常量级额外空间。
- 使用递归解题也符合要求,本题中递归程序的隐式栈空间不计入额外空间复杂度。
思路:116. 填充每个节点的下一个右侧节点指针的扩展版,和116题的区别是,不是完全二叉树,因此:
当前层开头设置一个虚拟节点pre,令pre->next指向当前层的第一个节点,root表示上一层节点,cur表示当前层的节点。
1、如何将当前层的节点都连起来:遍历上一层的每个节点,如果存在左节点,cur就和左节点连起来,如果存在右节点,cur就和右节点连起来。
2、如何找到下一层的起始节点:遍历完上一层节点后,把root移到下一行,也就是pre->next指向的位置,重置pre, cur。
class Solution {
public:
Node* connect(Node* root) {
Node *pre=new Node(0, nullptr, nullptr, nullptr), *cur=pre, *re=root;
while(root){
if(root->left){
cur->next=root->left;//开始将pre->next连接到当前行的起始节点
cur=cur->next;
}
if(root->right){
cur->next=root->right;
cur=cur->next;
}
root=root->next;
if(!root){
root=pre->next;//pre是一个虚拟节点,pre->next是当前行的起始节点
pre->next=nullptr;//重置pre为虚拟节点
cur=pre;//重置cur为和pre相等的虚拟节点
}
}
return re;
}
};