题解 | 二叉树的镜像|注意递归不要对原始数据造成破坏!

/**
 * struct TreeNode {
 *	int val;
 *	struct TreeNode *left;
 *	struct TreeNode *right;
 *	TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 * };
 */
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param pRoot TreeNode类 
     * @return TreeNode类
     */
    TreeNode* Mirror(TreeNode* pRoot) {
        // write code here
        if (pRoot == nullptr)
            return nullptr;

        TreeNode* left = Mirror(pRoot->left);
        TreeNode* right = Mirror(pRoot->right);
       
        pRoot->left = right;
        pRoot->right = left;
        // pRoot->left = Mirror(pRoot->right);
        // pRoot->right = Mirror(pRoot->left);

        return pRoot;
    }
};

28,29行的经典错误,这个在递归的时候修改了原本的tree。在递归的时候应该避免这种问题,应该把我需要做的递归在新的变量中保存起来然后去做执行。

树结构示例:

假设我们有如下的树:

    1
   / \
  2   3

递归步骤详解

  1. 初始调用 Mirror(pRoot),pRoot 为根节点 1。首先执行 pRoot->left = Mirror(pRoot->right),递归处理右子树(节点 3)。
  2. 进入右子树的递归调用 Mirror(pRoot->right),pRoot 为节点 3。节点 3 没有子节点,因此直接返回 3。
  3. 返回到根节点 1 的第一个递归调用,完成 pRoot->left = Mirror(pRoot->right)。此时根节点的左子树已经被设置为节点 3。树结构此时为:
  4. 开始执行第二个递归调用 pRoot->right = Mirror(pRoot->left),递归处理左子树(注意:此时的 pRoot->left 是刚刚设置为的节点 3)。
  5. 进入左子树的递归调用 Mirror(pRoot->left),pRoot 为节点 3。同样,节点 3 没有子节点,因此直接返回 3。
  6. 返回到根节点 1,完成 pRoot->right = Mirror(pRoot->left)。此时根节点的右子树也被设置为节点 3。树结构此时为:
  1
 / \
3   3

这个就是属于由于调用顺序的问题加上直接在原来的数据上做了修改,导致后面的数据的操作鲁棒性不够强。建议的就是像这里一样直接在栈上新创建变量来做递归,确保不受运行先后顺序影响。#剑指offer#

全部评论

相关推荐

2024-12-25 12:52
已编辑
浙江大学 算法工程师
前段时间,想着投一下简历看看现在的情况。本人背景,双非本华五硕士,均为科班,研一,有1篇顶会非一作, 2段小厂的开发实习(java python都写), 八股情况是只会一些开发的八股, 深度学习 机器学习 transformer 搜广推的八股没有准备简历上也只有小小的一行写了下论文,其他都是开发相关的一开始的主要目标就是java,后端开发, 会零星投几个搜广推和算法工程的岗位, 一周前开始投的,投了蛮多的(java 后端居多),最近只有三个约面的,还全都是算法,说实话问的也不算难, 只是我没有认真准备算法相关的八股,所以基本也都挂了vivo ai系统工程师,做moblie agent相关的业务, 主要是聊聊实习, 应该是过了,但是流程太长了,可能要终止了月之暗面 kimi预训练平台 一面挂小红书 主页 推荐算法 一面挂给我的体会就是java大厂实习的hc好像并不多,不知道是不是年底的缘故,还是现在一般优先考虑26毕业的同学的原因反倒是算法投了 就挺大概率约面,(我简历上只有一篇顶会非一作,而且只写了一行,其他都是开发的东西,  可惜之前没准备过对应的算法八股文,我面三场从来没人问论文,应该是因为我不是一作都说算法实习好找秋招难,java实习难秋招简单,真的是这样吗
点赞 评论 收藏
分享
2024-12-26 10:40
复旦大学 C++
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务