对称二叉树
给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [1,2,2,3,4,4,3] 是对称的。
1
/
2 2
/ \ /
3 4 4 3
但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:
1
/
2 2
\
3 3
方法1:递归
思路:
-
镜像就是左右两边相等,也就是左子树等于右子树,我们将根节点的左子树记为left,右子树记为right。比较left是否等于right,不等的话直接就可以返回。
-
如果相当,就比较left’的左节点,和right的右节点。
-
终止条件为left和right不等,或者left和right都为空
-
递归比较left.left和right.right,递归比较left.right和right.left
class Solution{ public boolean isSymmetric(TreeNode root){ if(root==null){ return true; } //调用递归函数,比较左节点,右节点 return dfs(root.left,root.right); } boolean dfs(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 dfs(left.left,right.right)&&dfs(left.right,right.left); } }
方法2:递归
思路:首先引入一个队列,这是把递归程序改写成迭代程序的常用方法。初始化时我们把根节点入队两次。每次提取两个结点并比较它们的值,然后将两个结点的左右子结点按相反的顺序插入队列中,当队列为空时,或者我们检测到树不对称时,该算法结束
class Solution{
public boolean isSymmetric(TreeNode root){
return check(root,root);
}
public boolean check(TreeNode u,TreeNode v){
Queue<TreeNode> q = new LinkedList<TreeNode>();
q.offer(u);
q.offer(v);
while(!q.isEmpty()){
u=q.poll();
v=q.poll();
if(u==null&&v==null){
continue;
}
if((u==null||v==null)||(u.val!=v.val)){
return false;
}
q.offer(u.left);
q.offer(v.right);
q.offer(u.right);
q.offer(v.left);
}
return true;
}
}