翻转二叉树---超全详细解
以下内容是从网站中学习的如果有错误欢迎指正。
翻转一棵二叉树。
思路
我们之前介绍的都是各种方式遍历二叉树,这次要翻转了,感觉还是有点懵逼。
这得怎么翻转呢?
如果要从整个树来看,翻转还真的挺复杂,整个树以中间分割线进行翻转。
可以发现想要翻转它,其实就把每一个节点的左右孩子交换一下就可以了。
关键在于遍历顺序,前中后序应该选哪一种遍历顺序? (一些同学这道题都过了,但是不知道自己用的是什么顺序)
遍历的过程中去翻转每一个节点的左右孩子就可以达到整体翻转的效果。
注意只要把每一个节点的左右孩子翻转一下,就可以达到整体翻转的效果
这道题目使用前序遍历和后序遍历都可以,唯独中序遍历不方便,因为中序遍历会把某些节点的左右孩子翻转了两次!建议拿纸画一画,就理解了
那么层序遍历可以不可以呢?依然可以的!只要把每一个节点的左右孩子翻转一下的遍历方式都是可以的!
递归遍历用前序遍历或者后序遍历都可以,但如果用中序遍历会导致有的子树被翻转两次有的子树不被翻转。
class Solution{//前后序遍历都可以// 中序不行,因为先左孩子交换孩子,再根交换孩子(做完后,右孩子已经变成了原来的左孩子),再右孩子交换孩子(此时其实是对原来的左孩子做交换)public TreeNode invertTree(TreeHode root){if(root == null){return null;}invertTree(root.left);invertTree(root.right);swapChildren(root);return root;}public void swapChildren(TreeNode root){TreeNode temp = root.left;root.left = root.right;root.right = temp;}
}