LeetCode-101-对称二叉树

文章讨论了判断二叉树是否对称的两种方法:一是通过中序遍历并反转右侧子树的结果,处理null节点和值不相等的情况;二是采用递归方式,直接比较左右子树是否镜像。
摘要由CSDN通过智能技术生成

   题目详情

解题想法

我的第一个思路是对左右子树分别进行中序遍历,然后将右子树或左子树的遍历结果reverse,判断两个结果是否相等,相等的话就是对称。但这个方法会有个别案例无法通过,跟保存结果的方式有关。例如如果左右子树的元素都是2,即使他们不对称,reverse之后还是会相等。这种案例可以通过将某个节点如果有一个null子节点,则将null元素添加到中序遍历结果中来解决。(有两个null节点子节点直接return,不能把两个null都添加进来,否则还会输出true).还有另一个无法通过的案例是根节点的左右子节点存才但val不相等,直接将这种特殊情况单独考虑了。

第二个思路就是递归了,递归函数的作用来判断左右子树是否镜像。

解题思路

 1.  对左右子树进行中序遍历

       

/**
 * 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.left!=null && root.right!=null){
            if(root.left.val!=root.right.val)   return false;
        }

        List<Object> leftList=inOrderTravel(root.left);
        List<Object> rightList=inOrderTravel(root.right);
        Collections.reverse(rightList);
        if(leftList.equals(rightList))  return true;
        else return false;
    }

    public List<Object> inOrderTravel(TreeNode root){
        List<Object> list=new ArrayList<>();
        if(root==null){
            list.add(null);
            return list;
        }
        if(root.left==null && root.right==null){
            list.add(root.val);
            return list;
        }
        list.addAll(inOrderTravel(root.left));
        list.add(root.val);
        list.addAll(inOrderTravel(root.right));
        return list;
    }
}

2. 递归判断左右子树是否镜像

/**
 * 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 isSymmetricSame(root.left, root.right);
    }

    public boolean isSymmetricSame(TreeNode left, TreeNode right) {
        if (left == null && right == null)
            return true;
        if (left != null && right != null)
            return left.val == right.val && isSymmetricSame(left.left, right.right) && isSymmetricSame(left.right, right.left);
        return false;
    }
}

 

 

  • 29
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值