题目:输入一个二叉树,输出该二叉树的镜像。
分析树的镜像的定义,就是前序遍历二叉树,如果存在左右子树,就交换左右节点。方便用递归实现。
public static void mirrorTree(TreeNode root){
//递归结束条件
if(root==null)
return;
if(root.left==null&&root.right==null)
return;
//必须先交换上层节点的左右子树
TreeNode temp=root.left;
root.left=root.right;
root.right=temp;
//递归翻转左右子树
if(root.left!=null){
mirrorTree(root.left);
}
if(root.right!=null){
mirrorTree(root.right);
}
}
测试下效果:
public static void main(String[] args) {
TreeNode root=new TreeNode(8);
TreeNode node1=new TreeNode(6);
TreeNode node2=new TreeNode(10);
TreeNode node3=new TreeNode(5);
TreeNode node4=new TreeNode(7);
TreeNode node5=new TreeNode(9);
root.left=node1;
root.right=node2;
node1.left=node3;
node1.right=node4;
node2.left=node5;
TreeNode.preOrderPrint(root);
mirrorTree(root);
System.out.println();
TreeNode.preOrderPrint(root);
}
preOrderPrint()是定义在树节点类中的静态方法,代码很简单:
public static void preOrderPrint(TreeNode root){
if(root==null)
return;
System.out.print(root.val+ " ");
preOrderPrint(root.left);
preOrderPrint(root.right);
}
镜像翻转前后树的前序遍历输出如下:
8 6 5 7 10 9
8 10 9 6 7 5