101 对称二叉树
题目
给定一个二叉树,检查它是否是镜像对称的。
思路
这个题就和上面那个题是类似到极致的,所谓镜像,不过就是判断在某个位置是否相同罢了,比如左子树的左子节点与右子树的右子节点是否相同,左子树的右子节点与右子树的左子节点是否相同。
那么看过上篇文章的就知道,碰到判断相同一般就是bfs或者dfs。
DFS
思路其实还是和上一篇的一样,创建一个函数,传入的参数分别是两个节点p和q,随后判断这俩节点是否为null,若null则相等,然后是一个为null,那就是false,随后即使在都不为null的情况下,判断其值是否相等,若是相等,那么就判断其子节点是否相等,上一题是按着顺序比较是否相等,但这一题要注意是:左子树的左子节点与右子树的右子节点是否相同,左子树的右子节点与右子树的左子节点。(有些看不懂建议看上一篇的100相同的树)
public boolean isSame(TreeNode treeNode1,TreeNode treeNode2){
if (treeNode1==null&&treeNode2==null){
return true;
}
if (treeNode1==null||treeNode2==null){
return false;
}
return treeNode1.val==treeNode2.val&&isSame(treeNode1.left,treeNode2.right)&&isSame(treeNode1.right,treeNode2.left);
}
然后原题中所给的函数只给了一个root节点,怎么调用呢?你直接这样写:
return isSame(root,root);
就是两个都从根节点来比较,这样还顺手可以判断其root是否为null的情况。
BFS
思路
bfs想都不用想肯定是队列的问题,既然还是判断相同,那我们就仍然建两个队列,然后一个一个的弹,进行比较。
两个队列都加入根节点,这个原因和上面最后递归调用写两个root是一样的原因。
随后就是老套的当队列不为null 的while循环。
然后弹出来进行判断,是否都为null,true的话就是continue,为什么是continue上一篇(100相同的树)已经解释过。一个为null就是false,都不为空的时候值不为null就是false,相等的话就加入下面的节点进行比较,这里加节点的时候要注意,不是无脑的按着上次的顺序加入,而是第一个队列加左子树的左右节点,第二个队列要加的是右子树的右左节点,这样才符合左右对称的镜像要求,最后这个while结束说明符合,则返回true。
public boolean isSymmetric(TreeNode root) {
Queue<TreeNode> nodeQueue1=new LinkedList<>();
Queue<TreeNode> nodeQueue2=new LinkedList<>();
nodeQueue1.add(root);
nodeQueue2.add(root);
while (!nodeQueue1.isEmpty()){
TreeNode treeNode1 = nodeQueue1.poll();
TreeNode treeNode2 = nodeQueue2.poll();
if (treeNode1==null&&treeNode2==null){
continue;
}
if (treeNode1==null||treeNode2==null){
return false;
}
if (treeNode1.val!=treeNode2.val){
return false;
}
nodeQueue1.add(treeNode1.left);
nodeQueue1.add(treeNode1.right);
nodeQueue2.add(treeNode2.right);
nodeQueue2.add(treeNode2.left);
}
return true;
}