void swap(struct TreeNode** rl,struct TreeNode **rr);
struct TreeNode *temp;
struct TreeNode* mirrorTree(struct TreeNode* root){
if(!root)
return root;
swap(&root->left,&root->right);
return root;
}
void swap(struct TreeNode** rl,struct TreeNode **rr){
temp=*rl;
*rl=*rr;
*rr=temp;
if((*rl)==NULL||(*rr)==NULL)
return;
swap(&((*rl)->left),&((*rl)->right));
swap(&((*rr)->left),&((*rr)->right));
}
为什么输入[2,3,null,1]时最后的节点没有swap
temp=*rl;
*rl=*rr;
*rr=temp;
if((*rl)==NULL&&(*rr)==NULL)
return;
if((*rl)!=NULL&&(*rr)!=NULL){
swap(&((*rl)->left),&((*rl)->right));
swap(&((*rr)->left),&((*rr)->right));
}
if((*rl)==NULL)
swap(&((*rr)->left),&((*rr)->right));
if((*rr)==NULL)
swap(&((*rl)->left),&((*rl)->right));
如果节点的左子树或右子树是NULL,调用swap函数时将会直接返回,而不会进一步递归交换左右子树的节点。
在你的输入[2,3,null,1]中,节点3的左子树是NULL,因此它的左右子树不会被交换。
如果希望在节点的左子树或右子树是NULL的情况下也执行交换操作,可以将swap函数中的以下代码段移出if语句:
if ((*rl) == NULL || (*rr) == NULL)
return;
修改之后:
void swap(struct TreeNode** rl,struct TreeNode **rr){
temp=*rl;
*rl=*rr;
*rr=temp;
swap(&((*rl)->left),&((*rl)->right));
swap(&((*rr)->left),&((*rr)->right));
}
这样,即使左子树或右子树为空,仍会递归调用swap函数来交换子节点的左右子树。