递归的浅浅应用

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

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

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

递归的浅浅应用_第1张图片

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

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

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

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

递归的浅浅应用_第2张图片

大家看这道题,我们最终返回的是经过翻转后的树的头结点,而且翻转节点这些操作在递归过程中或者回溯过程中就可以完成,所以我们并不需要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;
    }

你可能感兴趣的:(算法,算法,数据结构,树,递归)