101. 对称二叉树
Difficulty: 简单
给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [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
进阶:
你可以运用递归和迭代两种方法解决这个问题吗?
Solution
解析:此题虽然被标记为简单,但是我认为第一次接触的话,不一定会做;摘抄解析
取自官方解释:
Two trees are a mirror reflection of each other if:
1.Their two roots have the same value.
2.The right subtree of each tree is a mirror reflection of the left subtree of the other tree.
如果满足以下条件,两棵树是彼此的镜像:
1.它们的两个根具有相同的值。
2.每棵树的右子树是另一棵树的左子树的镜像。
个人理解:看了讨论区大佬的留言 官方的解析 ,自己的理解如下
- 根节点至少要有,首先应该判断根节点是否存在,若不存在,则为true
- 设想一下:问题是判断一棵二叉树为对称,如果其左子树和右子树互为镜像对称,那这棵二叉树一定互为镜像对称,这样问题点就转移了;只要左右子树相互对称,那么这棵数一定是相互对称;
- 用递归的方法来做,最主要的是找到递归点;层层往下,左 右子树还可以继续拆分,左子树也有左右子树;右子树也有左右子树,照着这个思路一直往下走,只要左右子树不相等的, 这整棵二叉树一定不对称,反之一定对称
- 注意很重要的一点:官方的解析中第二条一定要理解:官方说的是每棵树的子树,这个描述的意思根节点的左子树(左子树同样是一棵二叉树,同理,右子树也是这样)同样也有左右子树
- 判断依据:左树的左节点与右树的右节点对称;左树的右节点和右树的左节点对称
Language: java 递归
/**
* 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;
// 在判断 左子树和右子树
return check(root.left, root.right);
}
public boolean check(TreeNode node1, TreeNode node2){
if(node1 == null && node2 == null) return true;
if(node1 == null || node2 == null) return false;
// 左树的左节点与右树的右节点对称;左树的右节点和右树的左节点对称;节点的值需要一样
return node1.val == node2.val && check(node1.right, node2.left) && check(node1.left, node2.right);
}
}