题目描述
请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。
第一次:90%
思路:中序遍历二叉树,把值存入list中,然后判断list是否对称的。
错误例子:{5,5,5,5,#,#,5,5,#,5} list对称不代表位置对称
import java.util.ArrayList;
public class A58对称的二叉树 {
private ArrayList<Integer> list = new ArrayList<Integer>();
boolean isSymmetrical(TreeNode pRoot) {
if(pRoot == null) {
return true;
}
//中序遍历二叉树,将值存入list中
ldr(pRoot);
//判断list是否是对称的
int len = list.size();
if(len % 2 != 0) {
for(int i = 0; i < len / 2; i++) {
if(list.get(i) != list.get(len - 1 - i)) {
return false;
}
}
} else {
return false;
}
return true;
}
//中序遍历
private void ldr(TreeNode pRoot) {
if(pRoot != null) {
ldr(pRoot.left);
list.add(pRoot.val);
ldr(pRoot.right);
}
}
}
第二次:100%
思路:
写一个方法判断两个树是否镜像。
1、判断两棵树的值是否相等,不相等返回false
2、相等,在递归判断树1的左子树和树2的右子树是否镜像,以及树1的右子树和树2的左子树是否是镜像
public class A58对称的二叉树2 {
boolean isSymmetrical(TreeNode pRoot) {
if(pRoot == null) {
return true;
}
return judge(pRoot.left,pRoot.right);
}
//判断两棵树是否对称
boolean judge(TreeNode left, TreeNode right) {
if(left == null && right == null) {
return true;
} else if(left != null && right != null) {
if(left.val == right.val) {
return judge(left.right, right.left) && judge(left.left, right.right);
}
}
return false;
}
}