首页 > 编程语言 > javascript-代码随想录训练营day16

javascript-代码随想录训练营day16

时间:2022-12-09 20:56:41浏览次数:67  
标签:return javascript 随想录 最小 day16 二叉树 深度 root 节点

104.二叉树的最大深度

题目链接:

https://leetcode.cn/problems/maximum-depth-of-binary-tree/

题目描述:

给定一个二叉树,找出其最大深度。

二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。

说明: 叶子节点是指没有子节点的节点。

思路:

这个问题很容易通过递归解决,一颗树的最大深度=右左子树最大深度的最大值+1。

代码:

var maxDepth = function(root) {
    if(!root) return 0
    return Math.max(maxDepth(root.left), maxDepth(root.right))+1
};

111.二叉树的最小深度

题目链接:

https://leetcode.cn/problems/minimum-depth-of-binary-tree/

题目描述:

给定一个二叉树,找出其最小深度。

最小深度是从根节点到最近叶子节点的最短路径上的节点数量。

说明:叶子节点是指没有子节点的节点。

思路:

类比上一题,同样使用递归。一颗树的最小深度=左右子树最小深度的最小值+1 ?这里有坑,题目描述的最小深度的终点必须要是叶子节点。如果一个根节点的左子树为空的,右子树的最小深度为5,按照上面的

公式,这颗树的最小深度为 0+1=1,但实际上是5+1=6。

所以一颗树的最小深度应该分类讨论:

  1. 左子树为空,这棵树的最小深度=右子树最小深度+1
  2. 右子树为空,这棵树的最小深度=左子树最小深度+1
  3. 否则,这颗树的最小深度=左右子树最小深度的最小值+1

代码:

var minDepth = function(root) {
    if(!root) return 0
    let leftDepth = minDepth(root.left)
    let rightDepth = minDepth(root.right)
    if(leftDepth === 0){
        return rightDepth + 1
    }
    else if(rightDepth === 0){
        return leftDepth + 1
    }
    else{
        return Math.min(leftDepth, rightDepth) + 1
    }
};

222.完全二叉树的节点个数

题目链接:

https://leetcode.cn/problems/count-complete-tree-nodes/

题目描述:

给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。

完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。

思路:

使用各种方式将二叉树完全遍历一边自然可以得到节点个数。但是没有利用到题目中完全二叉树的性质。

对这题来说,完全二叉树的两个性质十分重要:

  1. 完全二叉树的特殊类型为满二叉树。k层的满二叉树,节点数为$2^k-1$
  2. 完全二叉树最后一层的节点是从左到右连续排列的

先补充判断完全二叉树是否是满二叉树的方法:使用两个指针分别从不断左子树和右子树向下移动,如果两个指针同时到达叶子节点说明这棵树为满二叉树。

利用递归解决这题,树的节点个数=左子树的节点个数+右子树的节点个数+1。对每个子树:首先判断其是不是满二叉树,如果是满二叉树,直接利用公式求出节点个数;如果不是满二叉树,就继续递归。那么的递归的终止条件就是以当前节点为根节点的树是否是满二叉树,如果是直接返回节点数。

代码:

var countNodes = function(root) {
    if(!root) return 0
    let leftCur = root.left
    let rightCur = root.right
    let depth = 1
    while(leftCur && rightCur){
        leftCur = leftCur.left
        rightCur = rightCur.right
        depth++
    }
    if(!(leftCur || rightCur)) return 2**depth - 1

    return countNodes(root.left) + countNodes(root.right) + 1
};

标签:return,javascript,随想录,最小,day16,二叉树,深度,root,节点
From: https://www.cnblogs.com/endmax/p/16969979.html

相关文章

  • JavaScript:控制跳转:break、continue与标签
    在循环结构中,经常需要使用关键字break和continue来控制跳转;遇到break,就会跳出循环结构,执行循环体后面的代码;遇到continue,就会跳出本次循环,进入下一次循环;那么,假如有嵌套......
  • JavaScript -- DOM事件总结
    OverridetheentrypointofanimageIntroducedinGitLabandGitLabRunner9.4.Readmoreaboutthe extendedconfigurationoptions.Beforeexplainingtheav......
  • JavaScript:立即执行函数
    想象一下,如果我希望某个代码块,只执行一次,就不再执行,应该怎么办?代码块肯定是用函数来表示,执行肯定是调用函数,但是确保只执行一次,该怎么办?我们为什么可以多次调用函数,因为......
  • JavaScript:对象:如何复制一个对象?浅拷贝与深拷贝
    回顾一下,我们对传参的讨论,对象的传参是引用传递,我们传递的是对象数据所在的内存地址;那么无论我们怎么去赋值,所有变量指向的都是同一块内存;如上图所示,无论我去使用哪个变......
  • JavaScript:对象:如何读取、添加、删除对象的属性?
    如何给对象添加属性?直接对象名.属性名去添加属性直接对象名[属性名]去添加属性,此时属性名得是字符串类型,可以直接引号,也可以用变量名如何读取对象的属性值?这......
  • JavaScript:对象:如何去遍历输出一个对象的属性?语句for-in
    使用for-in的for循环语句,可以去遍历一个对象的属性,这类似于Java的增强for循环;但是注意,这并不能遍历对象的所有属性,有些隐藏的属性,是无法遍历出来的,虽然我们可以通过控制台......
  • JavaScript:箭头函数:省略写法
    之所以把箭头函数拎出来,是因为它不仅仅是声明函数的一种方式,它还是函数式编程的重要根基,它使得函数的使用更加的灵活,同时,它的语法,也相对于function声明的函数更加灵活和复......
  • JavaScript:箭头函数:作为参数进行传参
    之前已经说过,JS的函数,也是对象,而函数名是一个变量,是可以进行传参的,也即函数是可以被传参的。只要是函数,都可以被传参,但是箭头函数的语法更为灵活,所以更方便进行传参。如......
  • JavaScript:对象:如何创建对象?
    JS是面向对象的语言,除开基础数据类型,其他所有的数据类型都是对象,包括函数。如何去理解对象,什么是对象呢?举个例子,比如我们将日常生活中见到的猫这种动物,抽象成一个类Cat,这......
  • JavaScript:变量: 如何声明变量?
    声明变量可以用下面几种方式:但是这几种声明方式肯定是有区别的,主要是上面三种方式的区别,这需要结合window对象和作用域来说明,这里不赘述。声明变量的时候,推荐使用let,这......