题目描述
操作给定的二叉树,将其变换为源二叉树的镜像。
输入描述:
二叉树的镜像定义:源二叉树
8
/ \
6 10
/ \ / \
5 7 9 11
镜像二叉树
8
/ \
10 6
/ \ / \
11 9 7 5
其实就是交换二叉树的左右子树,可用递归实现:
交换根节点的左右孩子,再分别对左孩子进行镜像和右孩子进行镜像
这是关于方法二的解析,如果懂栈的可以直接略过,不懂得可以看一看。
package jzoffer;
import java.util.LinkedList;
import javax.swing.tree.TreeNode;
public class MirrorTest {
public static void Mirror1(NewTreeTest root){
if(root == null){
return;
}else{
System.out.print(root.data+" ");
NewTreeTest temp = root.leftTree;
root.leftTree = root.rightTree;
root.rightTree = temp;
Mirror1(root.leftTree);
Mirror1(root.rightTree);
}
}
public static void Mirror2(NewTreeTest root){
if(root == null){
return ;
}
LinkedList<NewTreeTest> stack = new LinkedList<NewTreeTest>();
NewTreeTest current = null;
NewTreeTest temp = null;
stack.push(root);
while(!stack.isEmpty()){
current = stack.pop();
System.out.println(current.data+" ");
System.out.println("执行了几次?");
while(current.leftTree != null || current.rightTree != null){
temp = current.leftTree;
current.leftTree = current.rightTree;
current.rightTree = temp;
}
if(current.leftTree != null){
stack.push(current.leftTree);
}
if(current.rightTree != null){
stack.push(current.rightTree);
}
}
}
public MirrorTest() {
}
public static void main(String[] args) {
NewTreeTest newTree1 = new NewTreeTest(1);
NewTreeTest newTree2= new NewTreeTest(2);
NewTreeTest newTree3 = new NewTreeTest(3);
NewTreeTest newTree4 = new NewTreeTest(4);
NewTreeTest newTree5 = new NewTreeTest(5);
NewTreeTest newTree6 = new NewTreeTest(6);
NewTreeTest newTree7 = new NewTreeTest(7);
newTree1.leftTree = newTree2;
newTree1.rightTree = newTree3;
newTree2.leftTree = newTree4;
newTree2.rightTree = newTree5;
newTree3.leftTree = newTree6;
newTree3.rightTree = newTree7;
System.out.println("下面是第一棵树:");
System.out.println(" 1 ");
System.out.println(" 2 3 ");
System.out.println("4 5 6 7");
System.out.println("下面是第一棵树的镜像:");
System.out.println(" 1 ");
System.out.println(" 3 2 ");
System.out.println("7 6 5 4");
System.out.println("镜像之后的输出(注意 这个是镜像之后的前序输出 )");
Mirror1(newTree1);//这是递归之后的输出
// Mirror2(newTree1);//这个是非递归的输出
}
}
class NewTreeTest{
int data;
NewTreeTest leftTree = null;
NewTreeTest rightTree = null;
public NewTreeTest(int data){
this.data = data;
this.leftTree = null;
this.rightTree = null;
}
}
结果图如下: