problem:
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 -> NULLTree Depth-first Search
thinking:
(1)类似于B*树,每层节点也链接起来。
(2)看到题,我立即想到用层序遍历来做,采用BFS,但是题目要求constant extra space,目的是想用DFS来做做,
由于这道题的二叉树的特殊性(满树)不具有普遍意义。所以我采用更具普遍意义的BFS方法,可能空间复杂度不满足要求,但也AC了
(3)BFS 是采用queue结构存储每一层的节点。
code:
class Solution {
public:
void connect(TreeLinkNode *root) {
if(root==NULL)
return;
queue<TreeLinkNode*> queue0;
queue0.push(root);
level_visit(queue0);
return;
}
protected:
void level_visit(queue<TreeLinkNode*> queue1)
{
if(queue1.empty())
return;
queue<TreeLinkNode*> queue2=queue1;
queue<TreeLinkNode*> queue3;
TreeLinkNode *tmp=queue1.front();
queue1.pop();
tmp->next=NULL;
while(!queue1.empty())
{
TreeLinkNode *tmp2=queue1.front();
queue1.pop();
tmp2->next=NULL;
tmp->next=tmp2;
tmp=tmp2;
}
while(!queue2.empty())
{
TreeLinkNode *node=queue2.front();
queue2.pop();
if(node->left!=NULL && node->right!=NULL)
{
queue3.push(node->left);
queue3.push(node->right);
}
}
level_visit(queue3);
}
};