题目:
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
题意:
如例子给出,本题的目标是将二叉树每层的子节点通过next指针连接。因为与下一题太相似,用同样的思路AC之后发现,本题的二叉树都是完全二叉树,即左右子树完全平衡。优化代码如下,原思路代码在下一题解给出。
代码:
void connect(TreeLinkNode *root) {
if(root == NULL)
return;
queue<TreeLinkNode*> q;
q.push(root);
TreeLinkNode *cur, *pre = NULL;
int cur_num = 1, next_num = 0;
while(!q.empty())
{
cur = q.front();
q.pop();
cur_num--;
if(cur->left != NULL && cur->right != NULL)
{
q.push(cur->left);
q.push(cur->right);
next_num += 2;
}
if(pre != NULL)
pre->next = cur;
pre = cur;
if(cur_num == 0)
{
cur->next = NULL;
pre = NULL;
cur_num = next_num;
next_num = 0;
}
}
return;
}
优化后的效率高于C++代码的90%,尽管也不是很优化,但还是比原来分别判断左右子树是否为空的做法效率要高一些。
题外话:
即将迎来新的开始,希望自己平常心,不卑不亢。现在窗外打雷下雨,好生惬意。希望一切都好。