题目:
请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。
解答:
暴力法:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public boolean isSymmetric(TreeNode root) {
if(root==null) return true;
Queue<TreeNode> queue=new LinkedList<TreeNode>();
List<Integer> list=new ArrayList<Integer>();
queue.add(root);
//将树每层的值存到list中,然后看是否对称。
while(!queue.isEmpty()){
int size=queue.size();
for(int i=0;i<size;i++){
TreeNode node=queue.poll();
if(node.left!=null){
queue.add(node.left);
list.add(node.left.val);
}else{
list.add(-1);
}
if(node.right!=null){
queue.add(node.right);
list.add(node.right.val);
}else{
list.add(-1);
}
}
for(int i=0,j=list.size()-1;i<j;i++,j--){
if(list.get(i)!=list.get(j))
return false;
}
list=new ArrayList<Integer>();
}
return true;
}
}
递归法:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public boolean isSymmetric(TreeNode root) {
//如果树是空,则是对称的,否则开始递归
return root == null ? true : recur(root.left, root.right);
}
boolean recur(TreeNode L, TreeNode R) {
//如果两个节点都是空,说明是这两个节点的父节点对应的这两个位置是对称的。
if(L == null && R == null) return true;
//如果一边是空,一边不是,则不对称;如果两边值不相同,则不对称。
if(L == null || R == null || L.val != R.val) return false;
//判断左父节点的左子节点与右父节点的右子节点是否对称;
//判断左父节点的右子节点与右父节点的左子节点是否对称;
return recur(L.left, R.right) && recur(L.right, R.left);
}
}