[JavaScript 刷题] 树 - 完全二叉树的节点个数, leetcode 222

github repo 地址: https://github.com/GoldenaArcher/js_leetcode,Github 的目录 大概 会更新的更勤快一些。

题目地址:222. Count Complete Tree Nodes

题目

如下:

Given the root of a complete binary tree, return the number of the nodes in the tree.

According to Wikipedia, every level, except possibly the last, is completely filled in a complete binary tree, and all nodes in the last level are as far left as possible. It can have between 1 and 2h nodes inclusive at the last level h.

Design an algorithm that runs in less than O(n) time complexity.

解题思路

这题的暴力解就是扫描所有的结点,每扫描一个节点 count++,那这样的时间复杂度肯定是 O(n)O(n)O(n),儿题目的要求是设计一个算法,并且其时间复杂度小于 O(n)O(n)O(n)

换言之,暴力地扫面所有结点地做法是无法满足的——不过的确可以通过就是了。

满足题目需求的一种做法就是利用完全二叉树的特点:

  • 完全二叉树除了最后一层外,所有地结点都会被完全填满

换言之,只需要搜索完全二叉树地最后一层即可。

实际操作地做法为:

  1. 查看当前左右子树的高度

  2. 如果左子树高度大于右子树,搜索左子树

    反之搜索右子树

这样在不断遍历地过程中,找到最后一层的最右侧结点。

以这棵树为例:

第一次搜索时,左右子树的高度相同,则代表左子树必然是个完全二叉树,因此无需继续搜索,只需搜索右子树即可。左子树的高度为 2h2^h2h,hhh 为左子树的高度。完全二叉树的高度为 2h−12^h - 12h−1,这里加上了根节点,就成为了 2h2^h2h。

这时候可以继续重复该过程,以此类推。

时间复杂度为 O(log2(n))O(log^2(n))O(log2(n)),理解方式为:

树的高度 x 树的最后一层子结点数量,即 log(n)×log(n)log(n) \times log(n)log(n)×log(n),总体的时间复杂度还是少于 O(n)O(n)O(n) 的:

绿色的是 O(n)O(n)O(n) 的时间复杂度,红色的为 O(log2(n))O(log^2(n))O(log2(n)),蓝色的为 O(log(n))O(log(n))O(log(n)),可以看出,这个算法的耗时还是远远低于 O(n)O(n)O(n)。

另一种理解方法也可以理解成——二叉搜索的二叉搜索。

使用 JavaScript 解题

var countNodes = function (root) {if (!root) return 0;const height = (root) => {let counter = 0;while (root) {counter++;root = root.left;}return counter;};const left = height(root.left);const right = height(root.right);if (left === right) return 2 ** left + countNodes(root.right);return 2 ** right + countNodes(root.left);
};

[JavaScript 刷题] 树 - 完全二叉树的节点个数, leetcode 222相关推荐

  1. 漫画:二叉树系列 第七讲(完全二叉树的节点个数)

    在上一篇中,我们学习了解了平衡二叉树,并且利用DFS进行了验证.在本节中,我们将继续学习完全二叉树的相关内容.首先了解一下什么是完全二叉树. 01 完全二叉树 完全二叉树由满二叉树引出,先来了解一下什 ...

  2. C#LeetCode刷题-树

    树篇 # 题名 刷题 通过率 难度 94 二叉树的中序遍历 61.6% 中等 95 不同的二叉搜索树 II 43.4% 中等 96 不同的二叉搜索树 51.6% 中等 98 验证二叉搜索树 22.2% ...

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

    完全二叉树的节点个数 题目链接 描述 示例 初始代码模板 代码 题目链接 https://leetcode-cn.com/problems/count-complete-tree-nodes/ 描述 ...

  4. c#二叉树 取叶子节点个数_二叉树的最小深度+完全二叉树的节点个数

    二叉树的最小深度 题目:给定一个二叉树,找出其最小深度. 最小深度是从根节点到最近叶子节点的最短路径上的节点数量. 说明:叶子节点是指没有子节点的节点. 示例 1: 输入:root = [3,9,20 ...

  5. 四 . LeetCode标签刷题——树/二叉树(一) 算法部分

    各种二叉树的介绍汇总: 二叉树:最多有两棵子树的树被称为二叉树 满二叉树:二叉树中所有非叶子结点的度都是2,且叶子结点都在同一层次上 完全二叉树:如果一个二叉树与满二叉树前m个节点的结构相同,这样的二 ...

  6. 数据结构与算法之完全二叉树的节点个数

    数据结构与算法之完全二叉树的节点个数 目录 数据结构与算法之完全二叉树的节点个数 1. 数据结构与算法之完全二叉树的节点个数 (一)思路 先遍历左边界获得树的高度h 遍历右子树的左边界,看看到没到最后 ...

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

    222. 完全二叉树的节点个数 题目描述: 给你一棵 完全二叉树的根节点 root ,求出该树的节点个数. 完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值 ...

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

    222. 完全二叉树的节点个数 给出一个完全二叉树,求出该树的节点个数. 说明: 完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集 ...

  9. 二叉树11:完全二叉树的节点个数

    Leetcode 222.完全二叉树的节点个数 要求是 给出一个完全二叉树,求出该树的节点个数. 完全二叉树的节点数其实是可以在找到最后一层最右侧的元素之后直接使用公式计算的.这里我们需要先明确什么是 ...

最新文章

  1. 浙江文成“红领巾”向交警敬礼:上下学感谢有你
  2. Windows常用命令行命令
  3. YaoLingJump开发者日志(七)
  4. Maven 仓库、镜像
  5. c语言计算器模拟程序,【C语言】 模拟计算器
  6. 2016年4月计算机组成原理试题答案,全国2018年4月自考(02318)计算机组成原理试题及答案...
  7. TWaver初学实战——基于HTML5的交互式地铁图
  8. Memento 备忘录 快照模式 MD
  9. linux显示防火墙端口命令,Linux查询端口是否被防火墙屏蔽 firewall-cmd命令用法
  10. python制作卡通表情包_python——简单生成表情包
  11. IntelliJ IDEA文件模板变量
  12. java tls_Java客户端中具有SNI的TLS
  13. 扫地机器人的构造及核心技术详解
  14. 实战 .Net 数据访问层 - 19
  15. 21-1职业沟通Do you agree
  16. JavaScript Web 框架的“新浪潮”
  17. 微信扫码下单小程序怎么弄(做扫码下单小程序的方法)
  18. 摄影师没了?!生成式人工智能即将降维打击摄影行业
  19. 安装Docker详细步骤总结
  20. 统计图之小提琴图解析

热门文章

  1. 高并发场景下JVM调优实践之路
  2. VisualGDB+Visual Studio 2019+CubeMX构建STM32工程问题记录(持续更新)
  3. 电脑总是弹出不支持的硬件提示解决办法
  4. 数据中心系列:SDDC普及仍任重而道远
  5. 知云文献翻译安装教程_阅读英文文献的好帮手
  6. 不同的反射系数,信号的是怎样的呢?
  7. 2022年江苏省职业院校技能大赛中职赛项规程
  8. Saber 2016 安装和破解(WIN10)
  9. 怎么把多个JPG合并成一个PDF?还不快来学
  10. 目标检测之VOC2007格式数据集制作