剑指offer53--判断对称二叉树
2016-07-29 16:31
459 查看
一、题目
题目:请实现一个函数来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。
二、举例
上图所示的树就是一个对称的二叉树
三、思想
(1)根据前序遍历和自定义的后序遍历分别来遍历二叉树,将遍历的结果分别存储在两个数组中,然后比较两个数组,如果两个数组中的对应元素是相等的,那么这就是对称二叉树了。(2)通过递归的思想来遍历,在遍历过成中就进行比较,如果有对应元素不相等就直接返回false,这种方式还是比较好的,因为效率比较高。详情见下面的代码。
四、程序
package 剑指offer; class BinaryTreeSym{ int value; BinaryTreeSym left; BinaryTreeSym right; public BinaryTreeSym() { } public BinaryTreeSym(int value){ this.value = value; } public String toString(){ return value+""; } } public class Test59 { // 定义一个存储前序遍历情况的数组 static int pre[] = new int[10]; static int preNum = 0; // 定义一个存储后序遍历情况的数组 static int back[] = new int[10]; static int backNum = 0; //定义前序的遍历的方式 public static void preOrder(BinaryTreeSym root){ if(root != null){ System.out.print(root.value+" "); pre[preNum++] = root.value; preOrder(root.left); preOrder(root.right); } } //自己定义一种后序遍历方式 public static void backOrder(BinaryTreeSym root){ if(root != null){ System.out.print(root.value+" "); back[backNum++] = root.value; backOrder(root.right); backOrder(root.left); } } public static boolean BinaryTreeCompare(BinaryTreeSym root){ if(root == null){ return false; } preOrder(root); System.out.println(""); backOrder(root); System.out.println(""); int flag = 0; // 比较前序遍历和后序遍历的结果是否相等,相等返回true,不相等返回false for(int i = 0; i < pre.length; i++){ if(pre[i] == back[i]){ flag ++; } } if(flag == pre.length){ return true; } return false; } private static void assemble(BinaryTreeSym node, BinaryTreeSym left, BinaryTreeSym right) { node.left = left; node.right = right; } // 如下是第二种实现方式,也是通过递归和比较的方式,不过这种方式是实时的 public static boolean SecondWayCompare(BinaryTreeSym root) { return SecondWayCompare(root, root); } public static boolean SecondWayCompare(BinaryTreeSym left, BinaryTreeSym right) { if (left == null && right == null) { return true; } if (left == null || right == null) { return false; } if (left.value != right.value ) { return false; } return SecondWayCompare(left.left, right.right) && SecondWayCompare(left.right, right.left); } // 1 //2 2 //4 6 6 4 public static void main(String args[]){ BinaryTreeSym n1 = new BinaryTreeSym(1); BinaryTreeSym n2 = new BinaryTreeSym(2); BinaryTreeSym n3 = new BinaryTreeSym(2); BinaryTreeSym n4 = new BinaryTreeSym(4); BinaryTreeSym n5 = new BinaryTreeSym(6); BinaryTreeSym n6 = new BinaryTreeSym(6); BinaryTreeSym n7 = new BinaryTreeSym(4); assemble(n1, n2, n3); assemble(n2, n4, n5); assemble(n3, n6, n7); System.out.println("First Way Result: "+BinaryTreeCompare(n1)); System.out.println("Second Way Result: "+SecondWayCompare(n1)); } }-----------------------output--------------------------
1 2 4 6 2 6 4 1 2 4 6 2 6 4 First Way Result: true Second Way Result: true第一行是前序遍历的结果,第二行是自定义的后序遍历的结果
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序