题目要求空间复杂度为常数级别,因此不能用递归或者使用队列辅助。
如果当前层中节点的next指针已经填充完毕,那么我们很容易根据当前层去填充下一层,只需要“记住”下一层的最左侧节点,即可通过循环实现题目的目标。在这里引入哑节点记录下一层最左侧节点。
另外的话,由于题中二叉树不是满二叉树或者完全二叉树,需要用一个辅助指针记录上一个节点。
代码如下:
class Solution { public: void connect(TreeLinkNode *root) { TreeLinkNode *left = root; while (left) { TreeLinkNode dummy(0), *prev; prev = &dummy; for (auto p = left; p; p = p->next) { if (p->left) { prev->next = p->left; prev = p->left; } if (p->right) { prev->next = p->right; prev= p->right; } } left = dummy.next; } } };