对称二叉树(简单)
2020年5月4日
题目来源:力扣
给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [1,2,2,3,4,4,3] 是对称的。
但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:
进阶:
你可以运用递归和迭代两种方法解决这个问题吗?
知识补充
poll() 和 remove() 都是从队列中取出一个元素,但是 poll() 在获取元素失败的时候会返回空,但是 remove() 失败的时候会抛出异常。
解题
跟昨天做的《相同的树》思路是一样的。
递归
/**
* 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;
//进入左右子树
return isequal(root.left,root.right);
}
public boolean isequal(TreeNode left,TreeNode right){
//如果都为空,对称
if(left==null && right==null) return true;
//只有一个为空,不对称
if(left==null || right==null) return false;
//值不同,不对称
if(left.val!=right.val) return false;
return isequal(left.left,right.right)&&isequal(left.right,right.left);
}
}
迭代
/**
* 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> list=new LinkedList<>();
list.add(root.left);
list.add(root.right);
while(!list.isEmpty()){
//左右结点出队列
TreeNode left=list.poll();
TreeNode right=list.poll();
//都为空,说明对称,继续迭代
if(left==null && right==null) continue;
//一个为空一个不为空,不对称,退出
if(left==null || right==null) return false;
//两个值不相等,退出
if(left.val!=right.val) return false;
//添加结点进队列
list.add(left.left);
list.add(right.right);
list.add(left.right);
list.add(right.left);
}
return true;
}
}
还是递归香!