题目:
翻转一棵二叉树
示例:如下图所示:
思路:
这道题目是非常经典的题目,也是比较简单的题目(至少一看就会)。
但正是因为这道题太简单,一看就会,一些同学都没有抓住起本质,稀里糊涂的就把这道题目过了。
如果做过这道题的同学也建议认真看完,相信一定有所收获!
其实就把每一个节点的左右孩子交换一下就可以了。
关键在于遍历顺序,前中后序应该选哪一种遍历顺序?
遍历的过程中去翻转每一个节点的左右孩子就可以达到整体翻转的效果。
注意只要把每一个节点的左右孩子翻转一下,就可以达到整体翻转的效果
这道题目使用前序遍历和后序遍历都可以,唯独中序遍历不方便,
因为中序遍历会把某些节点的左右孩子翻转了两次!建议拿纸画一画,就理解了
那么层序遍历可以不可以呢?依然可以的!只要把每一个节点的左右孩子翻转一下的遍历方式都是可以的!
代码:
解法一:递归法:
/**
* 前后序遍历都可以
* 中序不行,因为先左孩子交换孩子,再根交换孩子(做完后,右孩子已经变成了原来的左孩子),
* 再右孩子交换孩子(此时其实是对原来的左孩子做交换)
*/
class Solution{
public TreeNode invertTree(TreeNode root){
//边缘性检测
if(root == null) return null;
//左孩子交换
invertTree(root.left);
//右孩子交换
invertTree(root.right);
//交换根孩子
swapChildren(root);
return root;
}
//交换根孩子函数
private void swapChildren(TreeNode root){
TreeNode temp = root.left;
root.left = root.right;
root.right = temp;
}
}
解法二:迭代法
class Solution{
public TreeNode invertTree(TreeNode root){
//边缘性检测
if(root==null)return null;
//定义队列
ArrayDeque<TreeNode> deque = new ArrayDeque<>();
//将根节点放入队列
deque.offer(root);
while(!deque.isEmpty()){
int size = deque.size();
while(size-->0){
//移出队列
TreeNode node = deque.poll();
swap(node);
if(node.left!=null){
deque.offer(node.left);
}
if(node.right!=null){
deque.offer(node.right);
}
}
}
return root;
}
//交换函数
public void swap(TreeNode root){
TreeNode temp = root.left;
root.left = root.right;
root.right = temp;
}
}
力扣链接