给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [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
进阶:
你可以运用递归和迭代两种方法解决这个问题吗?
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/symmetric-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
递归方法:当根节点是空的时候,直接返回 true,然后判断根节点的左右节点情况,递归的精髓就在于,想办法解决当前节点的问题,再去考虑递归,那么第二层是镜像的条件就是左节点的左子树等于右节点的右子树并且左节点的右子树等于右节点的左子树,将此条件放入循环即可。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public boolean isSymmetric(TreeNode root) {
if(root == null) return true;//根节点为空,说明对称,直接返回true
return isMirrorTree(root.left, root.right);//返回根节点左右子树的情况
}
public boolean isMirrorTree(TreeNode node1, TreeNode node2) {
if(node1 == null && node2 == null) return true;//如果左右子树都是空,说明对称
if(node1 == null || node2 == null) return false;//如果左右子树只有一个是空,不对称
return node1.val == node2.val && isMirrorTree(node1.left, node2.right) && isMirrorTree(node1.right, node2.left);//当前节点值相等并且左节点的左子树等于右节点的右子树并且左节点的右子树等于右节点的左子树,继续递归调用
}
}
迭代方法,其实就是根据层次遍历来进行求解,此方法是用一个普通队列,每次出队前两个元素,再入队左节点的左子树和右节点的右子树和左节点的右子树和右节点的左子树 然后不断出队入队即可,需要注意的是,当两个节点都是空的时候,需要继续循环,continue就行了。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public boolean isSymmetric(TreeNode root) {
if(root == null) return true;
Queue<TreeNode> qu = new LinkedList<TreeNode>();
qu.offer(root.left);
qu.offer(root.right);
while(!qu.isEmpty()) {//层次遍历
TreeNode t1 = qu.poll();//出队前两个元素
TreeNode t2 = qu.poll();
if(t1 == null && t2 == null) continue;
if(t1 == null || t2 == null || t1.val != t2.val) return false;
qu.offer(t1.left);
qu.offer(t2.right);
qu.offer(t1.right);
qu.offer(t2.left);
}
return true;
}
}