题意:假设二叉树节点的数据结构如下:
struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode *next; }
填充next指针为该节点的下一个右节点,初始值为NULL。
如,二叉树为
1 / \ 2 3 / \ / \ 4 5 6 7
填充之后为
1 -> NULL / \ 2 -> 3 -> NULL / \ / \ 4->5->6->7 -> NULL
思路:分层遍历二叉树,用一个向量记录一层的节点,然后将前面节点的next指针指向后面节点。这里使用数组实现队列,从根节点出发,依次将节点从左到右压入一个数组,并用一个游标cur记录当前访问的节点,另一个游标last指示当前层次的最后一个节点的下一个位置,以cur==last作为当前层次访问结束的条件,在访问某一层的同时将该层的所有节点的子节点压入数组,在访问完某一层之后,检查是否还有新层次可以访问,直到访问完所有的层次。
代码:
void connect(TreeLinkNode *root) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
if (NULL==root)
return;
vector<TreeLinkNode*> vec;
vec.push_back(root);
int cur=0;
int last=1;
while (cur<vec.size())
{
last=vec.size();
vector<TreeLinkNode*> row;
while(cur<last)
{
row.push_back(vec[cur]);
if (vec[cur]->left)
vec.push_back(vec[cur]->left);
if (vec[cur]->right)
vec.push_back(vec[cur]->right);
cur++;
}
row.push_back(NULL);
for (int i=0;i<row.size()-1;i++)
row[i]->next=row[i+1];
}
}
然后通过root的next指针,找到需要与当前节点子节点连接的后继节点。
因为涉及到root的next指针查询,递归需要先处理完右子树,以便左子树节点next指针的连接。
void connect(TreeLinkNode *root) { if(!root)return; TreeLinkNode *temp=root->next,*p; if(root->left &&root->right) { p=root->right; root->left->next = root->right; } else if(root->right)p=root->right; else if(root->left)p=root->left; else p=NULL; if(p) { while(temp) { if(temp->left) { p->next = temp->left; break; } else if(temp->right) { p->next = temp->right; break; } else temp=temp->next; } } connect(root->right); connect(root->left); }