二叉树7:LeetCode226:翻转二叉树
Posted 纵横千里,捭阖四方
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树7:LeetCode226:翻转二叉树相关的知识,希望对你有一定的参考价值。
z将二叉树整体反转,如下图所示:
你在纠结这个题该怎么做对不?我告诉你有2*2+1,至少5种方式来处理。
首先这里是所有非空节点都交换其两个孩子节点,所以我们可以使用前序或者后续来进行,而前序和后续都有递归和迭代两种方式,这就4种方法。
另外,我们还可以每次获得一层,然后将该层整体翻转再处理下一层。
所以至少有5种处理方式。
1.递归翻转的两种方法
这是一道很经典的二叉树问题。显然,我们从根节点开始,递归地对树进行遍历,并从叶子节点先开始翻转。如果当前遍历到的节点 root 的左右两棵子树都已经翻转,那么我们只需要交换两棵子树的位置,即可完成以 root 为根节点的整棵子树的翻转。
先看前序交换:
class Solution {
public TreeNode invertTree(TreeNode root) {
if (root == null) {
return null;
}
TreeNode val=root.left;
root.left=root.right;
root.right=val;
TreeNode left = invertTree(root.left);
TreeNode right = invertTree(root.right);
return root;
}
}
再看后序的:
class Solution {
public TreeNode invertTree(TreeNode root) {
if (root == null) {
return null;
}
TreeNode left = invertTree(root.left);
TreeNode right = invertTree(root.right);
root.left = right;
root.right = left;
return root;
}
}
这里的区别非常小,主要就是先翻转还是先访问左右子树。所以上面的翻转一个是自顶向下,一个是自下而上的。
2.迭代翻转
这个用迭代也定能完成,但是二叉树的题一般我们能用递归写出来就行了,所以这里我就看一种迭代的实现,我们这里就看前序方式的:
class Solution {
public TreeNode invertTree(TreeNode root) {
if(root==null) {
return null;
}
//将二叉树中的节点逐层放入队列中,再迭代处理队列中的元素
LinkedList<TreeNode> queue = new LinkedList<TreeNode>();
queue.add(root);
while(!queue.isEmpty()) {
//每次都从队列中拿一个节点,并交换这个节点的左右子树
TreeNode tmp = queue.poll();
TreeNode left = tmp.left;
tmp.left = tmp.right;
tmp.right = left;
//如果当前节点的左子树不为空,则放入队列等待后续处理
if(tmp.left!=null) {
queue.add(tmp.left);
}
//如果当前节点的右子树不为空,则放入队列等待后续处理
if(tmp.right!=null) {
queue.add(tmp.right);
}
}
//返回处理完的根节点
return root;
}
}
3.层次遍历翻转法
参差翻转法也有多种处理方式,我们这里的方式是元素出队的时候,想将其左右两个孩子反转再入队。以此类推,最终完成翻转。
class Solution {
public TreeNode invertTree(TreeNode root) {
LinkedList<TreeNode> que = new LinkedList<TreeNode>();
if (root == null)
return null;
while (que.size()>0) {
int size = que.size();
for (int i = 0; i < size; i++) {
TreeNode node = que.remove();
swap(node.left, node.right); // 节点处理
if (node.left!=null)
que.add(node.left);
if (node.right!=null)
que.add(node.right);
}
}
return root;
}
public static void swap(TreeNode left,TreeNode right){
TreeNode tmp=left;
left=right;
right=tmp;
}
}
以上是关于二叉树7:LeetCode226:翻转二叉树的主要内容,如果未能解决你的问题,请参考以下文章
leetcode 226 Invert Binary Tree 翻转二叉树
Leetcode刷题100天—226. 翻转二叉树(二叉树)—day03