前言>写此文章的主旨中心是为了给阅读的同学提供一个只有干货+实战的心得体会, 方便没有自己的学习路线的同学能够快速了解一些问题的核心以及解决问题的思路.
当然了这些内容也不是自己思考出来的,也是通过学习别人的内容总结归纳出来的,所以对于博主来说也是一个学习成长以及记录的过程, 有一些不足之处还请谅解, 希望大家都能共同进步, 汲取更多的知识, 早日找到中意的工作~
此章节主要点首先区分两个概念 完全二叉树 与 满二叉树
满二叉树: 对应二叉树的每一层节点都是满的, 也就是说对于一个h层高的满二叉树来说, 节点值为2^h -1
完全二叉树: 对于根节点的两个子树中, 同样有一颗子树是满二叉树, 对于另外一个子树, 又可被拆分为满二叉树和子树.
区分此概念后, 我们要做一个常识性的解决方案, 尽可能快的计算出一个完全二叉树的节点个数
对应leetcode222题
之所以要介绍满二叉树, 就是因为我们需要基于满二叉树的基础上与计算完全二叉树的节点个数.
如上所说, 我们可以将 一个完全二叉树不断拆分成多个满二叉树进行递归计算, 直到最后得出节点个数
基于此有以下代码:
上述代码的特别之处在于, 充分利用了满二叉树的特性, 尽量减少对整个二叉树的节点遍历, 通过分析我们可以很清楚的看到, 上述代码的时间复杂度 = 递归函数的次数 * 每次递归的时间复杂度
递归的时间复杂度: 对于满二叉树来说, 一条子树跑到黑即可得到树高, 所以有Ologn
递归的次数: 对于高度不一致的子树来说, 我们拆分成一个满二叉树+另外一个子树, 不断拆分, 此次数也相当于树高Ologn
所以最终的时间复杂度为Ologn*Ologn