二叉树的镜像(翻转二叉树)

解法1:最容易想到的做法,递归调用。根据写法的不同,又可以分为,遍历到某个节点时,先调用递归,再交换该节点的左右节点,或者是遍历到某个节点时,先交换左右节点,再进行递归调用(这一种方式是可行的,但理解起来稍微困难一点)。

public class Solution {
    public void Mirror(TreeNode root) {
        if (root == null) {
            return ;
        }
        TreeNode temp = root.left;
        root.left = root.right;
        root.right = temp;
        Mirror(root.left);
        Mirror(root.right);
        return ;
    }
}

解法2:不使用递归,在遍历某个节点时,使当前节点入栈,遍历这个节点的全部子节点后,该节点才出栈

import java.util.Stack;

public class Solution {
     public void Mirror(TreeNode root) {
            if(root == null){
                return;
            }
            Stack<TreeNode> stack = new Stack<TreeNode>();
            stack.push(root);
            while(!stack.isEmpty()){
                TreeNode node = stack.pop();
                if(node.left != null||node.right != null){//其实这里可以不做判断
                    TreeNode temp = node.left;  //左右都为空交换了还是空。没区别
                    node.left = node.right;
                    node.right = temp;
                }
                if(node.left!=null){
                    stack.push(node.left);
                }
                if(node.right!=null){
                    stack.push(node.right);
                }
            }
        }
}

解法3 不使用递归,用队列来代替栈,遍历到某个节点时,首先将该节点出队,然后交换左右节点,把他的两个子节点入队。只要队列不为空,就说明还有节点需要交换。

import java.util.LinkedList;
import java.util.Queue;

public class Solution{
    public void invertTree(TreeNode root) {
        if (root == null) {
            return ;
        }
        //LinkedList实现了集合框架的Queue接口
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        while (!queue.isEmpty()) {
            TreeNode node = queue.poll();
            TreeNode left = node.left;
            node.left = node.right;
            node.right = left;
            if (node.left != null) {
                queue.offer(node.left);
            }
            if (node.right != null) {
                queue.offer(node.right);
            }
        }
        return ;
    }
}