首先,这里是一道简单题目,浅浅地验证了我之前发过的这篇文章 写递归题目的思路 ,我结合它来讲解一下这道题的思路:
剑指 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;
}