您的位置:首页 > Web前端

剑指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
第一行是前序遍历的结果,第二行是自定义的后序遍历的结果
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息