基于层序遍历
第一个想法肯定是层序遍历,然后因为该数是完美二叉树,所以如果可以将每层的结点连成链表形式。
如果该层已经连成了单链表,那么我们如果直到该层的做左边的结点,那么可以从左往右的遍历下层的结点,从而达到层序遍历的效果。
1.每次用当前层的结点将下面一层变成一个单链表。
2.对于该层的每个结点,左儿子指向自己的右儿子,还得将自己的右儿子指向下一个结点的左儿子。
3.用当前层更新完下一层的结点,跳到下一层的最左边。
$ 时间复杂度O(N), 空间复杂度O(1)$
参考文献
lc究极班
AC代码
/*
// 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) {
if (!root) return root;
auto t = root;
//有下一层
while (t->left) {
//用该层更新下一层
for (auto p = t ; p ; p = p->next) {
p->left->next = p->right;//左儿子执行右儿子
if (p->next) p->right->next = p->next->left;//右儿子指向下一个结点左儿子
}
t = t->left;
}
return root;
}
};