递归版本
public boolean isSymmetric(TreeNode root) {
if(root==null) return true;
TreeNode left = root.left;
TreeNode right = root.right;
if (left==null&&right==null) return true;
else if (left==null||right==null) return false;
if (left.val!=right.val) return false;
return isSymmetric(left.left,right.right)&&isSymmetric(left.right,right.left);
}
private boolean isSymmetric(TreeNode left,TreeNode right){
if (left==null&&right==null) return true;
else if (left==null||right==null) return false;
if (left.val!=right.val) return false;
return isSymmetric(left.left,right.right)&&isSymmetric(left.right,right.left);
}
思路:基于前序遍历的对称判断
- 在主函数先对根下的左右子树进行对称判断,如果不对称,直接返回false,如果对称,要继续往下走进子函数的递归
- 到最后一个return语句,说明当前结点都是符合对称的,那么return的结果就要看接下来的子树是否符合,即对称位置子树的值是否相等
迭代版本
public boolean isSymmetric(TreeNode root) {
Queue<TreeNode> queue = new LinkedList<>();
TreeNode left =root, right =root;
queue.offer(left);
queue.offer(right);
while (!queue.isEmpty()){
left = queue.poll();
right = queue.poll();
if (left ==null&& right ==null) continue;
if (left ==null|| right ==null|| left.val!= right.val) return false;
queue.offer(left.left);
queue.offer(right.right);
queue.offer(left.right);
queue.offer(right.left);
}
return true;
}
思路:基于利用队列进行层次遍历进行对称判断
- 循环之前需要先将root存进队列两次,使其结构一致
- 弹出需要判断对称的两个结点,如果都为null直接进行下一次循环,不符合对称直接返回false,到最后两个结点均不为null,将对称的结点两两配对存进队列,可类比递归方案的最后一个return语句
- 循环结束,没有出现不对称情况,返回true