注意一个事实:到根节点的左子节点的next要么指向根节点的右子节点(右子节点不为空),要么就指向根节点的next(或者next的next)节点p,直到该p节点具有下一代的节点。也就是说,将每一层的next链上的节点视为兄弟关系,那么子辈的兄弟必然是父辈兄弟的子辈。基于以上事实,采用DFS,注意右子树比左子树优先搜索到,因为左子树的next要用到右子树的next链信息。代码如下:
void connect(TreeLinkNode *root) {
if(root==NULL||(root->left==NULL&&root->right==NULL)) return;
TreeLinkNode* pt=NULL;
TreeLinkNode* p = root->next;
while(p!=NULL&&p->right==NULL&&p->left==NULL) p = p->next;
if(p!=NULL){
if(p->left!=NULL) pt = p->left;
else if(p->right!=NULL) pt = p->right;
}
if(root->right!=NULL)
{
root->right->next = pt;
}
if(root->left!=NULL)
{
if(root->right!=NULL) root->left->next = root->right;
else root->left->next = pt;
}
connect(root->right);
connect(root->left);
}