思路:
翻转二叉树其实还是基于二叉树的三种遍历方式:递归,深度优先(前中后序stack),广度优先(队列)。
//1,采用递归的方式
//前序遍历(从上向下翻转)
public TreeNode invertTree(TreeNode root) {
if(root==null) return root;
TreeNode node=root.left;
root.left=root.right;
root.right=node;
invertTree(root.left);
invertTree(root.right);
return root;
}
//中序遍历不可,因为交换完后,便利的实际还是原来的左子树。
//后序遍历(从下向上翻转)
public TreeNode invertTree(TreeNode root) {
if(root==null) return root;
invertTree(root.left);
invertTree(root.right);
TreeNode node=root.left;
root.left=root.right;
root.right=node;
return root;
}
//2,深度优先遍历
//前序遍历
public TreeNode invertTree(TreeNode root) {
if(root==null) return root;
Stack<TreeNode> stack = new Stack<>();
stack.push(root);
while(!stack.empty()){
TreeNode node = stack.pop();
TreeNode temp=node.left;
node.left=node.right;
node.right=temp;
if(node.right!=null) stack.push(node.right);
if(node.left!=null) stack.push(node.left);
}
return root;
}
//3,广度优先遍历
public TreeNode invertTree(TreeNode root) {
if(root==null) return root;
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
while(!queue.isEmpty()){
int size=queue.size();
for(int i=0;i<size;i++){
TreeNode node=queue.poll();
TreeNode cur =node.left;
node.left=node.right;
node.right=cur;
if(node.left!=null) queue.offer(node.left);
if(node.right!=null) queue.offer(node.right);
}
}
return root;
}