判断一棵二叉树是否为对称的树。如
1
/ \
2 2
/ \ / \
3 4 4 3
观察上面的树可以看出:左子树的右子树等于右子树的左子树,左子树的左子树等于右子树的右子树。
首先可以使用递归。递归容易理解
class Solution {
public boolean isSymmetric(TreeNode root) { if(root==null) return true; return isSym(root.left,root.right); }
public boolean isSym(TreeNode node1,TreeNode node2){
if(node1==null&&node2==null) return true;
if(node1==null||node2==null) return false;
if(node1.val!=node2.val) return false;
return isSym(node1.left,node2.right)&&isSym(node1.right,node2.left);
}
}
再是可以使用迭代,不用递归。
思路就是向遍历一样,每一层比较,但是不输出,只是在遍历过程中比较。使用广度优先遍历。因为要比较,所以一次取出两个节点,进行比较。然后存放时,因为需要比较的是a节点的左子树跟b节点的右子树,a节点的右子树和b节点的左子树。所以存放时也按照这种顺序存放进队列,方便取出两个时直接比较。见代码
public boolean isSymmetric(TreeNode root) { if(root==null) return true; Queue<TreeNode> q=new LinkedList<>();
//先存入两个节点,用于比较
q.add(root.left);
q.add(root.right);
while(q.size()>0){
TreeNode left=q.poll();
TreeNode right=q.poll();
if(left==null&&right==null) continue;//由于可能存入的就是null,所以还得继续比较
if(left==null||right==null) return false;
if(left.val!=right.val) return false;
//这里存放顺序很重要,方便下次取出比较。
q.add(left.left);
q.add(right.right);
q.add(left.right);
q.add(right.left);
} return true;
}