递归的浅浅应用

首先,这里是一道简单题目,浅浅地验证了我之前发过的这篇文章 写递归题目的思路 ,我结合它来讲解一下这道题的思路:

剑指 Offer 27 和 method 226.翻转二叉树

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

1.什么时候对数据进行操作 ?

我们分析题目后,发现是每个节点的左右子树都要进行交换,只要保证交换当前节点的左右子树时,不对本身节点进行操作,那么我们无论是递归时操作还是回溯时交换都可以。在这里我选择的是回溯时操作,先递归到最深处,然后回溯到哪个节点,就交换它的左右子树就可以。

2.递归函数中需要return什么? 

这是我这篇文章 写递归题目的思路 中的分析思路: 

大家看这道题,我们最终返回的是经过翻转后的树的头结点,而且翻转节点这些操作在递归过程中或者回溯过程中就可以完成,所以我们并不需要return任何值(这里是我的思路,当然也有其他思路是需要return节点的,大家自行理解便可),综上,属于第四种情况;

3.决定好终止条件的判断以及我们应该返回什么?

这道题的递归终止情况就是递归到了这棵树的最深处,即当前节点为null时return;结束此层递归即可。(因为我们上面选择的是情况4,所以我们就无需return值,直接结束即可)

综上,代码如下:

    public TreeNode mirrorTree(TreeNode root) {
        if (root==null){
            return null;
        }
        digui(root);//递归过程中对树结构操作,无需返回值
        return root;
    }

    void digui(TreeNode root) {
        if (root==null){
            return;
        }
        digui(root.left);
        digui(root.right);//递归函数在具体操作上面,属于先递归,回溯时操作数据
        TreeNode treeNode=root.left;
        root.left = root.right;
        root.right = treeNode;
        return;
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值