题目描述
操作给定的二叉树,将其变换为源二叉树的镜像。
输入描述:
二叉树的镜像定义:源二叉树
8
/ \
6 10
/ \ / \
5 7 9 11
镜像二叉树
8
/ \
10 6
/ \ / \
11 9 7 5
测试用例:
{8,6,10,5,7,9,11}
对应输出应该为:
{8,10,6,11,9,7,5}
分析:
-
做一个临时变量,使左子节点和右子节点的值进行交换,对子树走递归处理即可
-
设计一个栈,将输入的代表树的数列push到栈中,再将其pop出来,这样实现反转的效果,再针对这个新的树做左右子树的替换(只要左右子树有一个不为null就替换),再将非空的左右子节点分别push到栈中,即可实现镜像处理。
就好比字符串的反转一样——”I am a student.” -> “student. a am I”
我们可以先将整个字符串对象整个反转过来,即:”.tneduts a ma I”然后再针对每个单词做一个反转,得到—— “student. a am I”
但是需要注意的是这一种方式使用到了栈,所以需要在程序中添加import java.util.Stack这条语句。
源码:
第一种:
class TreeNode {//二叉树结构的类定义
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
public class Test1 {
public void Mirror(TreeNode root) {
if (root != null) {// 如果root非空,则继续向下进行
TreeNode temp;// 设置临时变量作为交换中转
temp = root.left;
root.left = root.right;
root.right = temp;
if (root.left != null) {// 当左子节点不为空,则递归调用Mirror方法
Mirror(root.left);
}
if (root.right != null) {
Mirror(root.right);
}
}
}
}
第二种:
import java.util.Stack;
class TreeNode {// 二叉树结构的类定义
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
public class Test1 {
public void Mirror(TreeNode root) {
if (root!= null) {
Stack<TreeNode> stack = new Stack<TreeNode>();
stack.push(root);
while (!stack.isEmpty()) {
TreeNode t1 = stack.pop();
if (t1.left!=null ||t1.right !=null) {
TreeNode temp;// 设置临时变量作为交换中转
temp = t1.left;
t1.left = t1.right;
t1.right = temp;
}
if (t1.left != null) {// 当左子节点不为空就将其push到栈中。
stack.push(t1.left);
}
if (t1.right != null) {
stack.push(t1.right);
}
}
}
}
}
运行测试:
第一种:
运行时间:29ms
占用内存:8880k
第二种:
运行时间:22ms
占用内存:8676k
总结:
总体来说是第一种方法递归更加的容易理解和记忆。但是也有着递归的通病。
第二种方法更加的巧妙。
但是这个题,里面的方法应该设置成有返回值得更好一点吧。这样void算是什么。