LeetCode每日1题--对称二叉树

48 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第28天,点击查看活动详情

前言

算法的重要性不言而喻!区分度高!

现在学习的门槛低了,只有能上网每个人都可以学编程!培训班6个月就可以培养出来能干活的人,你怎么从这些人中脱颖而出?没错!就是学算法,学一些底层和基础的东西。

说的功利点是为了竞争,卷死对手。真心话说就是能提高自己的基础能力,为技术可持续发展做好充分的准备!!!

提前入门学习书籍:CPrimerPlus、大话数据结构

image-20220705103735001

刷题网站

代码随想录 (programmercarl.com)

leetcode

我是按照代码随想录提供的刷题顺序进行刷题的,大家也可以去刷leetcode最热200道,都可以

刷题嘛,最重要的就是坚持了!!!

画图软件

OneNote

这个要经常用,遇见不懂的流程的话就拿它画一画!

笔记软件

Typoral

题目

image.png

解析

首先还是一个二叉树的定义

/**
 * 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;
 *     }
 * }
 */

其实就是比较左右子树是否是相互反转的嘛,所以我们用递归的方法来解题

递归解答

1.确定返回值和参数:判断是否相等,那就返回Boolean喽,参数的话就是两个子树

2.确定终止条件: 就是判断什么时候会返回结果,当左节点为空时、右节点为空时统统返回false 当两边都为空时,true 空节点的情况排除完了,剩下的判断逻辑就是通过递归逻辑来判断了节点值相同true,不同false

3.确定递归的逻辑 你可以发现,基本思路都是差不多

先是排除空节点的情况,之后判断左右节点的值是否相等

最后通过return compareInside && compareOutside;来判断是否为true,为true则认为是对称二叉树!

        //递归逻辑判断子节点值是否相等
        //比较内侧
        boolean compareInside = compare(left.right,right.left);
        //比较外侧
        boolean compareOutside = compare(left.left,right.right);
        return compareInside && compareOutside;
        

完整代码如下:

代码不难,加上我们前面的解析,应该都可以拿下完整代码


class Solution {

    public boolean isSymmetric(TreeNode root) {
    
       return compare(root.left,root.right);
       
    }    

    boolean compare(TreeNode left,TreeNode right){
        //首先排除空结点情况
        if(left == null && right != null){
            return false;
        }
        if(left != null && right == null){
            return false;
        }
        if(left == null && right == null){
            return true;
        }
        //排除节点值不相同的情况
        if(left.val != right.val){
            return false;
        }

        //递归逻辑判断子节点值是否相等
        //比较内侧
        boolean compareInside = compare(left.right,right.left);
        //比较外侧
        boolean compareOutside = compare(left.left,right.right);
        return compareInside && compareOutside;
    }
}


以上,明天继续