题目
LeetCode116,填充每个节点的下一个右侧节点指针。
给定一个 完美二叉树 ,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:
struct Node {
int val;
Node *left;
Node *right;
Node *next;
}
填充它的每个 next
指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL
。
初始状态下,所有 next 指针都被设置为 NULL
。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/populating-next-right-pointers-in-each-node
题目著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题解
思路
- 层序遍历,宽度优先搜索
- 每一层进行处理即可
层序遍历
我习惯用两个容器q
, tmp
(队列)保存数据
q
保存每一层的数据,tmp
暂存每一层的数据
时间复杂度
O(n)
空间复杂度
O(n)
需要存每一层的数据
代码
/*
// Definition for a Node.
class Node {
public:
int val;
Node* left;
Node* right;
Node* next;
Node() : val(0), left(NULL), right(NULL), next(NULL) {}
Node(int _val) : val(_val), left(NULL), right(NULL), next(NULL) {}
Node(int _val, Node* _left, Node* _right, Node* _next)
: val(_val), left(_left), right(_right), next(_next) {}
};
*/
class Solution {
public:
Node* connect(Node* root) {
queue<Node*> q, tmp;
q.push(root);
while(q.size()) {
Node* pre = nullptr; // 同一层的上(左)一个节点,
while(q.size()) {
Node* top = q.front(); // 当前节点
q.pop();
if(top == nullptr) continue;
if(pre) pre -> next = top; // 上(左)一个节点的next是当前节点
pre = top; // 更新
tmp.push(top -> left); // 下一层,暂存至tmp
tmp.push(top -> right);
}
// 拷贝至q
while(tmp.size()) {
q.push(tmp.front());
tmp.pop();
}
}
return root;
}
};