题目:
Given a binary tree
struct TreeLinkNode {
TreeLinkNode *left;
TreeLinkNode *right;
TreeLinkNode *next;
}
Populate each next pointer to point to its next right node. If there is no next right node, the next pointer should be set to NULL
.
Initially, all next pointers are set to NULL
.
Note:
- You may only use constant extra space.
- You may assume that it is a perfect binary tree (ie, all leaves are at the same level, and every parent has two children).
For example,
Given the following perfect binary tree,
1
/ \
2 3
/ \ / \
4 5 6 7
After calling your function, the tree should look like:
1 -> NULL
/ \
2 -> 3 -> NULL
/ \ / \
4->5->6->7 -> NULL
思路一:DFS,保证子节点被调用前root已经连好。
class Solution {
public:
void connect(TreeLinkNode *root) {
if (root == nullptr) return;
if (root->left != nullptr) {
root->left->next = root->right;
}
if (root->right != nullptr && root->next != nullptr) {
root->right->next = root->next->left;
}
connect(root->left);
connect(root->right);
}
};
总结:复杂度为O(2^n).
思路二:DFS并不是O(1)的space. 而是O(h),因为需要储存一条路径上的所有点。常数空间的做法是模拟BFS,由于当前层的next指针已经由上一层处理完毕,因此不需要队列,仅需要一个指针就可以完成该层的遍历。同时记录该层的第一个节点,当遍历完一层后,下一层由当前层第一个节点的左子节点开始。
class Solution {
public:
void connect(TreeLinkNode *root) {
if (root == nullptr) return;
while (root->left != nullptr) { //not the bottom level
TreeLinkNode* level_runner = root;
while (level_runner != nullptr) {
level_runner->left->next = level_runner->right;
if (level_runner->next != nullptr) {
level_runner->right->next = level_runner->next->left;
}
level_runner = level_runner->next;
}
root = root->left;
}
}
};
总结:复杂度为O(2^n).