题目描述
给定一个二叉树:
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 = [] 输出:[]
个人C++解答
GYL
看着灵神的题解写的,自己的话还是写不出递归来,菜就多练
①用DFS,用辅助数组记录深度和左节点,可以理解为每个深度只记录一个左节点,然后查询到右节点的时候让左节点指向右节点,由于开始的时候,所有的next节点均为null那么只需改变存在右边节点的即可。
②用BFS,遍历,将每一层都用next连接起来,但实际写起来感觉也很麻烦,直接复制灵神代码了;
③BFS+链表,依旧是灵神,
DFS
class Solution {
vector<Node*> pre;
public:
Node* connect(Node* root) {
dfs(root,0);
return root;
}
void dfs(Node* node, int depth) {
if(node == nullptr){
return ;
}
if(depth == pre.size()){
pre.push_back(node);
}else{
pre[depth]->next = node;
pre[depth] = node;
}
dfs(node->left,depth+1);
dfs(node->right,depth+1);
}
};
BFS
class Solution {
public:
Node* connect(Node* root) {
if (root == nullptr)
return nullptr;
vector<Node*> q = {root};
while(!q.empty()){
vector<Node*> nxt;
for (int i = 0; i < q.size(); i++) {
Node* node = q[i];
if (i) {
q[i - 1]->next = node;
}
if (node->left) {
nxt.push_back(node->left);
}
if (node->right) {
nxt.push_back(node->right);
}
}
q = move(nxt);
}
return root;
}
};

