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.
- Recursive approach is fine, implicit stack space does not count as extra space for this problem.
- You may assume that it is a perfect binary tree (ie, all leaves are at the same level, and every parent has two children).
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
思路:
两种方案:1 使用队列;2 递归
1 使用队列
同第102题,我们遍历二叉树的每一层,并将该层中的各个结点连接起来。
void connect(TreeLinkNode *root) {
if (!root) return;
queue<TreeLinkNode *> q;
q.push(root);
TreeLinkNode *last = root;
while (q.size()){
TreeLinkNode* curr = q.front();
q.pop();
if(curr->left) q.push(curr->left);
if(curr->right) q.push(curr->right);
if (last == curr){
if (q.size()) last = q.back();
}
else{
curr->next = q.front();
}
}
}
2 递归
这个递归很有意思,为了达到同层相连的效果需要使用到root->next来搭桥。
void connect2(TreeLinkNode *root){
if (!root) return;
if (root->left) root->left->next = root->right;
if (root->right) root->right->next = root->next ? root->next->left : NULL;
connect(root->left);
connect(root->right);
}