二叉树的镜像(翻转二叉树)
解法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 ; } }