题目
请完成一个函数,输入一个二叉树,该函数输出它的镜像(根节点左右子节点交换顺序)。
思路
画图可以很清晰地得到思路:先前序遍历,对每个结点交换左右子结点。
注意:前中后遍历参考
测试案例
1.功能测试(普通二叉树;左斜树;右斜树;一个结点)
2.特殊测试(根结点为null;)
Java代码+测试用例
public class mirrorOfTree {
//类似c++中结构体
public static class TreeNode{
int val=0;
TreeNode left=null;
TreeNode right=null;
//构造函数
public TreeNode(int val){
this.val=val;
}
}
public static void Mirror(TreeNode root){
if(root==null)
return;
//左右子节点交换
TreeNode tempNode=root.left;
root.left=root.right;
root.right=tempNode;
Mirror(root.left);
Mirror(root.right);
}
//前序遍历递归输出
public static void preOrderRe(TreeNode root){
if(root!=null){
System.out.println(root.val);
preOrderRe(root.left);
preOrderRe(root.right);
}
}
public static void main(String[] args) {
//1.功能测试
/*
8
/ \
6 10
/ \ / \
5 7 9 11
*/
TreeNode nodeA1=new TreeNode(8);
TreeNode nodeA2=new TreeNode(6);
TreeNode nodeA3=new TreeNode(10);
TreeNode nodeA4=new TreeNode(5);
TreeNode nodeA5=new TreeNode(7);
TreeNode nodeA6=new TreeNode(9);
TreeNode nodeA7=new TreeNode(11);
nodeA1.left=nodeA2;
nodeA1.right=nodeA3;
nodeA2.left=nodeA4;
nodeA2.right=nodeA5;
nodeA3.left=nodeA6;
nodeA3.right=nodeA7;
Mirror(nodeA1);
preOrderRe(nodeA1);
}
@Test//2.二叉树的所有节点都没有左子树
public void mirror2(){
TreeNode nodeA21=new TreeNode(8);
TreeNode nodeA22=new TreeNode(10);
TreeNode nodeA23=new TreeNode(11);
nodeA21.right=nodeA22;
nodeA22.right=nodeA23;
Mirror(nodeA21);
preOrderRe(nodeA21);
}
@Test//3.二叉树的所有节点都没有右子树
public void mirror3(){
TreeNode nodeA31=new TreeNode(8);
TreeNode nodeA32=new TreeNode(10);
TreeNode nodeA33=new TreeNode(11);
nodeA31.left=nodeA32;
nodeA32.left=nodeA33;
Mirror(nodeA31);
preOrderRe(nodeA31);
}
@Test//4.只有一个节点
public void mirror4(){
TreeNode nodeA41=new TreeNode(6);
Mirror(nodeA41);
preOrderRe(nodeA41);
}
@Test//5.特殊输入测试
public void mirror5(){
Mirror(null);
preOrderRe(null);
}
}