一、问题分析
翻转一个二叉树,直观上看,就是把二叉树的每一层左右顺序倒过来。比如问题中的例子,第三层1-3-6-9经过变换后变成了9-6-3-1,顺序反过来就对了。 再仔细观察一下,对于上面的例子,根节点(root)的左子节点及其所有的子孙节点构成根节点的左子树(left subtree),同样的,根节点(root)的右子节点及其所有的子孙节点构成根节点的右子树(right subtree)。因此翻转一个二叉树,就是把根节点的左子树翻转一下,同样的把右子树翻转一下,在交换左右子树就可以了。
当然,翻转左子树和右子树的过程和当前翻转二叉树的过程没有区别,就是递归的调用当前的函数就可以了。 因此,翻转二叉树的步骤可总结如下:
如果是空节点,翻转结束。
1、翻转根节点的左子树 和 右子树
2、翻转左子树(递归调用)
3、翻转右子树(递归调用)
4、返回root
1 public class Solution { 2 public TreeNode invertTree(TreeNode root) { 3 if(root == null) return root; 4 TreeNode tmp = root.left; 5 root.left = root.right; 6 root.right = tmp; 7 invertTree(root.left); 8 invertTree(root.right); 9 return root; 10 } 11 }