二叉树镜像反转的问题


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

img


 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函数来交换子节点的左右子树。