二叉树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 翻转二叉树

LeetCode226. 翻转二叉树

LeetCode #226 翻转二叉树

Leetcode刷题100天—226. 翻转二叉树(二叉树)—day03

Leetcode刷题100天—226. 翻转二叉树(二叉树)—day03

leetcode226 翻转二叉树(Easy)