标题 | 101. 对称二叉树 |
难度 | 简单 |
天数 | 第11天,第3/3题 |
数据结构 | 树 |
给你一个二叉树的根节点
root
, 检查它是否轴对称。
示例 1:
输入:root = [1,2,2,3,4,4,3]
输出:true
示例 2:
输入:root = [1,2,2,null,3,null,3]
输出:false
提示:
- 树中节点数目在范围
[1, 1000]
内 -100 <= Node.val <= 100
进阶:你可以运用递归和迭代两种方法解决这个问题吗?
以上内容来源:力扣(LeetCode)
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路:
- 什么情况是对称二叉树
1.左右子树都是null
//左右树都是null,是对称二叉树
if(left == null && right == null){
return true;
}
2.左树的左子树==右树的右子树
,左树的右子树==右树的左子树
采用递归判断
- 什么情况不是对称二叉树
1.左子树存在,右子树不存在
left != null && rigth ==null
2.左子树不存在,右子树存在
left!== null && rigth != null
3.左右子树都在,值不相等
left.val != right.val
整理出递归方法里的信息
public boolean isSymmetricForChild(TreeNode left, TreeNode right){
//左右树都是null,是对称二叉树
if(left == null && right == null){
return true;
}
if(left == null || right == null || left.val != right.val){
//1. 左树null,右树不是null,不是对称
//2. 左树不是null,右树是null 不是对称
//3. 左右树值不相等,不适合对称
return false;
}else{
return isSymmetricForChild(left.left,right.right) && isSymmetricForChild(left.right,right.left);
}
}
- 针对
完整代码:
/**
* 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 {
//数据结构 第 11 天 3/3 树
public boolean isSymmetric(TreeNode root) {
return isSymmetricForChild(root.left,root.right);
}
public boolean isSymmetricForChild(TreeNode left, TreeNode right){
//左右树都是null,是对称二叉树
if(left == null && right == null){
return true;
}
if(left == null || right == null || left.val != right.val){
//1. 左树null,右树不是null,不是对称
//2. 左树不是null,右树是null 不是对称
//3. 左右树值不相等,不适合对称
return false;
}else{
//1.对比 左树的左树,和右树的右树
//2.对比 左树的右树,和右树的左树
// 根
// / \
// 左树 右树
// /\ /\
// 左1 右1 左2 右2
//上图中也就是对比 左1 vs 右2 右1 vs 左2 都符合才是对称二叉树
return isSymmetricForChild(left.left,right.right) && isSymmetricForChild(left.right,right.left);
}
}
}