题目描述:

  给定一棵完全二叉树的头节点head,返回这棵树的节点个数。
  如果完全二叉树的节点数为N,请实现时间复杂度低于O(N)的解法。

 1 /*
 2     思路: 其实也是一种二分的思路。
 3         因为是完全二叉树,所以可以分为根结点的左右子树计算节点个数。
 4         首先求得该完全二叉树的深度h。
 5         然后判断根结点的右子树的最左节点是否在深度h上,
 6         如果在,则说明该完全二叉树的左子树为一个深度为h-1的满二叉树,
 7             其结点个数有:2^(h-1)-1个,加上根结点,结点总个数为2^(h-1)。
 8           最后在对右子树进行递归求解其节点个数。
 9         如果右子树的最左结点不再深度h上,则说明其右子树为一个深度为h-2的满二叉树,
10             其结点个数有:2^(h-2)-1个,加上根结点,结点总个数为2^(h-2)。
11           最后再对左子树进行递归求解结点个数。
12
13         转换为一般情况:若此时根结点处于
14 */
15 #include <iostream>
16 using namespace std;
17
18 struct TreeNode {
19     int val;
20     struct TreeNode *left;
21     struct TreeNode *right;
22     TreeNode(int x) :
23             val(x), left(NULL), right(NULL) {
24     }
25 };
26
27 int mostLeftDepth(struct TreeNode* head, int level){    // 求head的最左节点所处的深度
28     while (head != NULL){
29         level++;
30         head = head->left;
31     }
32     return level-1;
33 }
34 int bs(struct TreeNode* head, int l, int h){
35     if (l == h)
36         return 1;
37     if (mostLeftDepth(head->right,l+1) == h)
38         return (1 << (h-l)) + bs(head->right, l+1, h);
39     else
40         return (1 << (h-l-1)) + bs(head->left, l+1, h);
41 }
42
43 int nodeNum(struct TreeNode* head) {
44     if (head == NULL)
45         return 0;
46     return bs(head, 1, mostLeftDepth(head,1));
47 }
48
49 int main(){
50     TreeNode* head = new TreeNode(1);
51     TreeNode* a = new TreeNode(2);
52     head->left = a;
53     TreeNode* b = new TreeNode(3);
54     head->right = b;
55     cout << nodeNum(head) << endl;
56     return 0;
57 }

转载于:https://www.cnblogs.com/qianmacao/p/4884789.html

3-3-完全二叉树结点数相关推荐

  1. 森林结点数,边数与树个数的关系

    森林结点数,边数与树个数的关系 @(算法学习) 若森林F有15条边,25个结点.则F中包含树的个数是: A. 8 B. 9 C. 10 D. 11 分析:森林中树的个数与结点数的关系推导. 先看一般性 ...

  2. 创建二叉树并计算结点数

    题目描述 编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储). 例如如下的先序遍历字符串: ABC##DE#G##F### 其中"#"表示的 ...

  3. 计算二叉树的深度和叶子结点数

    目录 一.求给定二叉树的深度 二.求给定二叉树中的叶子结点数 三.例题 一.求给定二叉树的深度 二叉树的深度就是二叉树中结点的最大层次.如果二叉树是空树,则深度为0:否则,可分别求二叉树根的左子树和右 ...

  4. 假设二叉树采用二叉链存储结构,编写一个算法,求出二叉树中的叶子结点数,并设计主函数调用上述算法。

    假设二叉树采用二叉链存储结构,编写一个算法,求出二叉树中的叶子结点数,并设计主函数调用上述算法. #include<iostream>//蓝多多算法实验五:二叉树的应用(二) #inclu ...

  5. 设某棵二叉树中度数为 0 的结点数为 N0 ,度数为 1 的结点数为 N1 ,则该二叉树中度数为 2 的结点数为? ;若采用二叉链表作为该二叉树的存储结构,则该二叉树中共有 ? 个空指针域

    度数为 2 的结点数为N0-1:有 2N0+N1个空指针域 分析: 根据总结点数=总度数+1,所以N0+N1+N2=0✘N0+1✘N1+2✘N2+1,得出N2=N0-1,度数为2的结点数就为N0-1 ...

  6. 【数据结构】求以孩子兄弟表示法存储的森林的叶子结点数,树高

    1.求叶子结点数 T的第一个孩子存在T->firstChild里,所以如果T连第一个孩子都没有,那肯定为叶子结点,也就是说T->firstChild==NULL. 所以说,以孩子兄弟表示法 ...

  7. C++数据结构与算法—用递归方法求二叉树的叶子结点数

    用递归方法写一个算法,求二叉树的叶子结点数int leafnum(BTREE T). 要求: 1.定义二叉树的抽象数据类型和型BTREE,并定义基本操作. 2.编写函数1eafnum(BTREE T, ...

  8. 代码实现求二叉树结点数和叶子结点数(C语言)

    本篇会用到之前讲过的二叉树三种遍历方法的代码实现,当然这里还会再写一遍,可以先去看这篇博客二叉树的概念及三种遍历方法(C语言)_Perfectkn的博客-CSDN博客 目录 两种方法求二叉树结点总个数 ...

  9. c语言二叉树结点 深度,求二叉树的深度、总结点数和叶子结点数

    二叉树的二叉链表的存储结构: typedef   char   TElemType; typedef   struct    BiTNode { TElemType data;//数据元素 BiTNo ...

最新文章

  1. Linux学习笔记(一)Linux常用命令
  2. Java线程6个状态详解
  3. dnf安徒恩服务器不稳定,DNF安图恩掉线怎么办 INS安图恩攻坚战不惧掉线
  4. kafka相关名称介绍
  5. csdn相册超出了20m了,怎么办?求助
  6. C语言和设计模式(解释器模式)
  7. MySQL保存计算结果_在数据库中保存计算结果如何对应到相应的工程文件
  8. 2017年英国机器人周:身体有问题 就找机器人
  9. Mish:一个新的state of the art的激活函数,ReLU的继任者
  10. 软件测试中什么是正交分析法,软件测试用例设计方法之正交分析法
  11. ctfmon是什么启动项_win10系统启动项中没有ctfmon进程的图文方法
  12. android助手盒子版,小米盒子助手
  13. 使用usb有线网卡u-boot无法ping通虚拟机
  14. 项目管理术语英汉对照表
  15. matlab模型预测控制基本原理,matlab模型预测控制
  16. Python文本挖掘练习(一)// 新闻摘要
  17. 联邦学习纵向逻辑回归公式推导
  18. Python生成城市热力图
  19. TiDB 在零氪科技(LinkDoc)大数据医疗系统的实践
  20. Oracle——SQL基础练习

热门文章

  1. 印度首次挑战登月告败,一步之遥≈多大差距?
  2. 2019年中国科创板全面解读报告
  3. 超级干货:一文看懂5G产业链及投资机会
  4. 下一次工业革命:计算生物学与生物平台
  5. 平均 15189 元!2021 年 3 月程序员工资统计出炉
  6. @程序员,什么才是“2020-1024”的正确打开姿势?
  7. 又跌了!7 月程序员工资平均 14357 元 | 原力计划
  8. clickhouse修改时区
  9. Sublime Text3常用插件以及安装方法(实用)
  10. How to use nheqminer in RedHat based systems (CentOS/Fedora)