当前位置: 首页 > Web前端 > JavaScript

Leetcode解题系列——对称二叉树(递归)

时间:2023-03-27 01:08:26 JavaScript

本题旨在分享刷Leecode过程中发现的一些有趣或有价值的想法。[当然答案是基于js的]。递归算法一直是leetcode中等难度习题的重点类型之一,所以重点不言而喻。题目相关原题地址:https://leetcode-cn.com/problems/dui-cheng-de-er-cha-shu-lcof/题目描述:请实现一个判断二叉树是否对称的函数。如果二叉树与其镜像相同,则二叉树是对称的。例如,二叉树[1,2,2,3,4,4,3]是对称的。1/\22/\/\3443但是下面的[1,2,2,null,3,null,3]不是镜像对称的:1/\22\\33同学们考虑一下吧可能比较少用js刷leetcode。这里简单介绍下js中树型数据输入的表示。如上题内容,给定一棵二叉树的输入不是数组,而是应该是这样的:每个节点都是一个对象:constroot={val:3,left:{//left代表当前nodeLeftchildnodeval:9,left:null,//对比上图可以看出节点9没有左右子节点right:null,},right:{val:20,left:{val:15,//对比上图从图中可以看出,节点15没有左右子节点left:null,right:null,},right:{val:7,//对比上图,我们可以看到节点7没有左右孩子left:null,right}right:null,,}}思路分析首先这道题是一道很明显的递归题,递归题一般有以下几步:提取递归部分的逻辑判断边界条件。如果是,则必须从根节点的左右节点开始比较。遍历过程中遇到的每一组节点(用L和R表示)都要满足L的左节点=R的右节点和L的右节点=R的左节点才会递归比较,所以这里的等式其实只要val值相等即可:其次,考虑边界条件。如果初始是空树,则直接返回结果,也算对称;同步比较时,在任意一步,只要L的左节点=R的右节点,L的右节点=R的左节点,就会提前结束,返回false;如果它可以同时比较两端,那么它就是一棵对称树。返回真;那么根据上面,先写出递归部分的逻辑:varrecuCompare=function(L,R){if(!L&&!R){//表示比较同时结束或者没有这样两边的子节点返回true;}if(!L||!R||L.val!==R.val){//扣除第一种情况然后!L或!R表示左右同时结束,即存在不对称返回false;}returnrecuCompare(L.left,R.right)&&recuCompare(L.right,R.left);//继续比较}然后加入递归初始条件部分,完整代码可以得到完整代码/***一个二叉树节点的定义。*functionTreeNode(val){*this.val=val;*this.left=this.right=null;*}*//***@param{TreeNode}root*@return{boolean}*/varisSymmetric=function(root){if(!root){returntrue};returnrecuCompare(root.left,root.right)};varrecuCompare=function(L,R){if(!L&&!R){返回真;}if(!L||!R||L.val!==R.val){returnfalse;}returnrecuCompare(L.left,R.right)&&recuCompare(L.right,R.left);}有没有发现,递归题目写完代码后时间很短,但是难度更大理解,所以更需要自己去尝试去把握逻辑点。非常推荐大家手写代码,看完再运行。建议大家手写代码,看完再运行。写和细节其实是调试过程中最常见的bug。另外,大家可以借助这道题的思路,尝试解一下这道递归回溯题——树的子结构,巩固所学https://leetcode-cn.com/probl...然后,一道简单的一个问题又解决了!