题目:
请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。
分析:
通常,我们有3种不同的二叉树遍历算法,即前序、中序、后序。这三种遍历中,都是先左后右的方式。对于前序遍历,如果我们采用根右左的方式输出序列,和采用根左右的方式输出序列,对于一棵对称的满二叉树来说,这两个序列是一样的。
可是,对于非满二叉树来说,就不一定了。或者对于整棵树中结点值相同,结点个数相同的树,也是无法通过对比两个序列的方式判断两棵树是否对称的。我们在遍历二叉树的时候,如果将null补充进去,就可以解决这个问题了。
递归结束的条件是,在递归过程中,TreeA的left和TreeB的right值相同,递归深度走到最下面一层。
解法:
package com.wsy;
class Tree {
private int value;
private Tree left;
private Tree right;
public Tree() {
}
public Tree(int value) {
this.value = value;
this.left = this.right = null;
}
public Tree(int value, Tree left, Tree right) {
this.value = value;
this.left = left;
this.right = right;
}
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
public Tree getLeft() {
return left;
}
public void setLeft(Tree left) {
this.left = left;
}
public Tree getRight() {
return right;
}
public void setRight(Tree right) {
this.right = right;
}
}
public class Main {
public static void main(String[] args) {
Tree A = initA();
System.out.println(isSymmertrical(A, A));
}
public static Tree initA() {
Tree tree1 = new Tree(8);
Tree tree2 = new Tree(6);
Tree tree3 = new Tree(6);
Tree tree4 = new Tree(5);
Tree tree5 = new Tree(7);
Tree tree6 = new Tree(7);
Tree tree7 = new Tree(5);
tree1.setLeft(tree2);
tree1.setRight(tree3);
tree2.setLeft(tree4);
tree2.setRight(tree5);
tree3.setLeft(tree6);
tree3.setRight(tree7);
return tree1;
}
public static boolean isSymmertrical(Tree A, Tree B) {
if (A == null && B == null) {// 都走到了最底层
return true;
}
if (A == null || B == null) {// 有一个走到了底层,另一个没有走到
return false;
}
if (A.getValue() != B.getValue()) {// 某一结点的值不同
return false;
}
return isSymmertrical(A.getLeft(), B.getRight()) && isSymmertrical(A.getRight(), B.getLeft());
}
}