题目描述:
测试用例:
输入:{8,6,10,5,7,9,11}
返回值:{8,10,6,11,9,7,5}
思路1:
采用递归的思想
1. 先镜像根结点
2. 镜像右孩子和左孩子
代码如下:
class TreeNode{
public TreeNode left;
public TreeNode right;
public int val;
public TreeNode(int val) {
this.val = val;
}
}
public class Solution {
public TreeNode Mirror (TreeNode pRoot) {
if (pRoot == null){
return null;
}
TreeNode tmp = pRoot.left;
pRoot.left = pRoot.right;
pRoot.right = tmp;
Mirror(pRoot.left);
Mirror(pRoot.right);
return pRoot;
}
}
思路2:
利用树的BFS遍历方式来构建镜像二叉树
回顾一下树的BFS遍历方式
代码如下:
import java.util.LinkedList;
import java.util.Queue;
class TreeNode{
public int val;
public TreeNode left;
public TreeNode right;
public TreeNode(int val){
this.val = val;
}
}
public class TestDemo {
public static void testBFS(TreeNode root){
//如果根结点为null,直接返回
if (root == null){
return;
}
//构建一个队列用来辅助实现树的BFS遍历
Queue<TreeNode> queue = new LinkedList<>();
//将根结点入队列
queue.offer(root);
while (!queue.isEmpty()){
TreeNode node = queue.poll();
System.out.print(node.val+" ");
if (node.left != null){
queue.offer(node.left);
}
if (node.right != null){
queue.offer(node.right);
}
}
}
}
通过树BFS遍历,我们发现只要在后续入队列之前交换左子树和右子树的位置,然后在进行相应的操作即可!
代码如下:
import java.util.LinkedList;
import java.util.Queue;
class TreeNode{
public TreeNode left;
public TreeNode right;
public int val;
public TreeNode(int val){
this.val = val;
}
}
public class Solution {
public TreeNode Mirror (TreeNode pRoot) {
//如果是空树直接返回null
if (pRoot == null){
return null;
}
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(pRoot);
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 pRoot;
}
}