《剑指offer》 第27题 二叉树的镜像
二叉树的镜像
https://www.nowcoder.com/practice/564f4c26aa584921bc75623e48ca3011?tpId=13&tqId=11171&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking
二叉树的镜像(翻转二叉树)
解法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 ;
}
}白的不能再白的小白想刷剑指offer 文章被收录于专栏
刷刷题