0
点赞
收藏
分享

微信扫一扫

面试题28:对称的二叉树


题目:

请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。

分析:

通常,我们有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());
}
}

 

举报

相关推荐

0 条评论