剑指 Offer 27. 二叉树的镜像||力扣226. 翻转二叉树

这篇博客介绍了如何翻转一棵二叉树,提供了两种解法:递归法和辅助队列/栈(BFS层序遍历)。递归法通过交换节点的左右子节点实现,而队列/栈方法则通过遍历所有节点并交换左右子节点达到翻转目的。这两种方法都能有效地解决二叉树的翻转问题。
摘要由CSDN通过智能技术生成

给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。


分析:该题比较简单,在该节点及左右节点存在的情况下只需要交换当前节点的左右节点,循环迭代即可

方法一:递归法
        根据二叉树镜像的定义,考虑递归遍历(dfs)二叉树,交换每个节点的左 / 右子节点,即可生成二叉树的镜像。
        递归解析:
                终止条件:当节点 root 为空时(即越过叶节点),则返回 null ;
                递推工作:
                                初始化节点 tmp ,用于暂存 root 的左子节点;
                                开启递归 右子节点 mirrorTree(root.right) ,并将返回值作为 troot 的 左子节点 。
                                开启递归 左子节点 mirrorTree(tmp) ,并将返回值作为 root 的 右子节点 。
                返回值: 返回当前节点 root;

        简洁的代码:

class Solution {
public:
    TreeNode* mirrorTree(TreeNode* root) {
        if (root == nullptr) return nullptr;
        TreeNode* tmp = root->left;
        root->left = mirrorTree(root->right);
        root->right = mirrorTree(tmp);
        return root;
    }
};
class Solution {
public:
    TreeNode* mirrorTree(TreeNode* root) {
        recur(root);
        return root;
    }
    TreeNode* recur(TreeNode * head){
        TreeNode *temp = nullptr;
        if(head == nullptr)return head;
        //if(head->left!=nullptr || head->right!=nullptr){
        
        temp = head->left;
        head->left = head->right;
        head->right = temp;
        recur(head->left);
        recur(head->right);

        //}
        return head;
    }
};

方法二:辅助队列/栈(BFS层序遍历)
        利用栈(或队列)遍历树的所有节点 node,并交换每个 node 的左 / 右子节点。
        算法流程:
                特例处理: 当 root为空时,直接返回 null;
                初始化: 栈(或队列),本文用栈,并加入根节点 root 。
                循环交换: 当栈 stack 为空时跳出;
                出栈: 记为 node ;
                添加子节点: 将 node 左和右子节点入栈;
                交换: 交换 node 的左 / 右子节点。
                返回值: 返回根节点 root。

队列 queue

class Solution {
public:
    TreeNode* mirrorTree(TreeNode* root) {
        if(root==nullptr)return root;
        queue<TreeNode*> que;
        que.push(root);
        while(!que.empty()){
            TreeNode* head = que.front();
            que.pop();
            if(head->left!=nullptr)que.push(head->left);
            if(head->right!=nullptr)que.push(head->right);
            TreeNode *temp = head->left;
            head->left = head->right;
            head->right = temp;
        }
        return root;
    }
};

栈stack

class Solution {
public:
    TreeNode* mirrorTree(TreeNode* root) {
        if(root == nullptr) return nullptr;
        stack<TreeNode*> stack;
        stack.push(root);
        while (!stack.empty())
        {
            TreeNode* node = stack.top();
            stack.pop();
            if (node->left != nullptr) stack.push(node->left);
            if (node->right != nullptr) stack.push(node->right);
            TreeNode* tmp = node->left;
            node->left = node->right;
            node->right = tmp;
        }
        return root;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黑化草莓熊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值