题目链接:https://leetcode.com/problems/count-complete-tree-nodes/#/description

题目要求:计算完全二叉树的节点个数

思路:首先想到的是直接的递归,二叉树的节点个数 = 左子树的节点个数 + 右子树的节点个数 + 1

Java 代码如下:

public class Solution {// 二叉树的节点数 = 左子树的节点数 + 右子树的节点数 + 1public int countNodes(TreeNode root) {if(root == null){return 0;}return countNodes(root.left) + countNodes(root.right) + 1;  }
}

遍历了整个二叉树,时间复杂度为O(N)。然后超时了,因为上述方法并没有使用“完全二叉树”这个条件。

接下来考虑,对于完全二叉树,其左子树和右子树中至少有一个子树是满二叉树,而满二叉树的节点个数可以直接由 2^n-1得到,因此,是满二叉树的那一部分就不需要再遍历,因此可以提高效率。算法思路如下:首先计算出二叉树的最左侧分支和最右侧分支的层数,如果二者相等,则整个二叉树是满二叉树;若不相等,则递归的计算左右子树的节点数,总结点数=左子树节点数+右子树节点数+1。

Java代码如下:

public class Solution {// 获取左子树的高度(其实是最左侧分支)public int getLeftHeight(TreeNode root) {int count = 0;while (root != null) {count++;root = root.left;}return count;}// 获取右子树的高度(其实是最右侧分支的高度)public int getRightHeight(TreeNode root) {int count = 0;while (root != null) {count++;root = root.right;}return count;}public int countNodes(TreeNode root) {if (root == null) {return 0;}int leftHeight = getLeftHeight(root);int rightHeight = getRightHeight(root);if (leftHeight == rightHeight) {// 表示是满二叉树,二叉树的节点数直接由公式2^n-1得到// leftHeight即为层数, 1 << leftHeight使用位运算计算2^leftHeight,效率更高// 注意(1 << leftHeight) - 1 的括号必须有!!return (1 << leftHeight) - 1;} else {// 若该二叉树不是满二叉树,递归的调用该方法,计算左子树和右子树的节点数return countNodes(root.left) + countNodes(root.right) + 1;}}
}

LeetCode 222. Count Complete Tree Nodes 题解——Java相关推荐

  1. leetcode 222. Count Complete Tree Nodes | 222. 完全二叉树的节点个数(Java)

    题目 https://leetcode.com/problems/count-complete-tree-nodes/ 题解 思路参考左程云<程序员代码面试指南> 顺便贴一下草稿 代码 c ...

  2. leetcode 222 Count Complete Tree Nodes

    今天做了一道leetcode题,刚开始是暴力破解,发现special judge, very large tree 过不去,然后一顿想,一顿查,发现可以运用complete binary tree 的 ...

  3. 【LeetCode】222. Count Complete Tree Nodes 解题报告(Python)

    [LeetCode]222. Count Complete Tree Nodes 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个 ...

  4. Middle-题目95:222. Count Complete Tree Nodes

    题目原文: Given a complete binary tree, count the number of nodes. 题目大意: 给出一个完全二叉树,求节点数. 题目分析: 如果直接递归数节点 ...

  5. 222. Count Complete Tree Nodes

    题目: Given a complete binary tree, count the number of nodes. Definition of a complete binary tree fr ...

  6. 222 Count Complete Tree Nodes

    1,这道题如果纯用递归数点而不利用其为一个complete binary tree的话会超时. 2.为了利用这个条件,比较左右两子数的高度:1, 如果相等则左子树为完全二叉树 2, 如果不等, 则右子 ...

  7. LeetCode Count Complete Tree Nodes(二分法)

    问题:给出一个完全二叉树,求其结点个数 思路:第一种方式时直接使用递归法,将其左子树个数加上右子树个数再加上根结点 第二种方式二分法,因为完全二叉树除了最后一层外,其它都满足有2^i个结点,而最后一层 ...

  8. Count Complete Tree Nodes

    https://leetcode.com/problems/count-complete-tree-nodes/ 宽度优先搜索方法,超时!! /*** Definition for a binary ...

  9. LeetCode题解-222-Count Complete Tree Nodes

    没有做出来,所以参考了https://segmentfault.com/a/1190000003818177 迭代法的图解如下:

最新文章

  1. 可视化解释11种基本神经网络架构
  2. go reflect 取指针_Go的方法集详解
  3. Codeforces 472D
  4. Landsat中国西北地区行列号Shapefile图层对照(附行列号Shapefile下载)
  5. 支付宝H5 与网页端支付开发
  6. jfinal java搭建_Eclipse快速搭建Jfinal web应用 (一)
  7. 设备底座几个常见固定方式
  8. 黑色自适应简约个人主页引导页HTML源码
  9. Windows线程同步--关键段和旋转锁
  10. linux shell脚本字符串 字段分隔符 存入数组 根据下标取值
  11. java 状态常量_Java 变量和常量
  12. 利用MATLAB求均值、方差和标准差
  13. Legend of Mir(传奇)官方源码学习1、运行游戏
  14. array方法常用记载
  15. 一些个人笔记,持续更新ing
  16. aws mysql 多区_Amazon RDS 多可用区部署
  17. fd leak问题查找(Android)
  18. ESP32系列--第六篇 WiFi AP模式
  19. 后 R-CNN时代, Faster R-CNN、SSD、YOLO 各类变体统治下的目标检测综述:Faster R-CNN系列胜了吗?,(知乎ChenJoya大佬,讲的挺好的,记录一下)
  20. 第一次在公司用git克隆项目办法

热门文章

  1. (转载) 如何制作电子书?
  2. matlab2阶系统,基于Matlab/Simulink的二阶控制系统仿真研究
  3. 谷歌首提Android11,谷歌首提Android11,即将发布的Pixel 4会搭载?传统强项再突破...
  4. SpringBoot写一个聊天工具
  5. maya2018点输入序列号后不弹出激活页如何解决
  6. 京东平台研发:领域驱动设计(DDD)实践总结
  7. 光学接触角计算机软件,悬滴法表界面张力仪及接触角仪
  8. 对于拓扑空间的一些理解
  9. 总市值,流通股本,总金额有什么关系?大盘指数为什么不是多有股票指数之和
  10. 【PytorchLearning】基于 UNet 的肺部影像语义分割案例保姆教程