3-3-完全二叉树结点数
题目描述:
给定一棵完全二叉树的头节点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-完全二叉树结点数相关推荐
- 森林结点数,边数与树个数的关系
森林结点数,边数与树个数的关系 @(算法学习) 若森林F有15条边,25个结点.则F中包含树的个数是: A. 8 B. 9 C. 10 D. 11 分析:森林中树的个数与结点数的关系推导. 先看一般性 ...
- 创建二叉树并计算结点数
题目描述 编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储). 例如如下的先序遍历字符串: ABC##DE#G##F### 其中"#"表示的 ...
- 计算二叉树的深度和叶子结点数
目录 一.求给定二叉树的深度 二.求给定二叉树中的叶子结点数 三.例题 一.求给定二叉树的深度 二叉树的深度就是二叉树中结点的最大层次.如果二叉树是空树,则深度为0:否则,可分别求二叉树根的左子树和右 ...
- 假设二叉树采用二叉链存储结构,编写一个算法,求出二叉树中的叶子结点数,并设计主函数调用上述算法。
假设二叉树采用二叉链存储结构,编写一个算法,求出二叉树中的叶子结点数,并设计主函数调用上述算法. #include<iostream>//蓝多多算法实验五:二叉树的应用(二) #inclu ...
- 设某棵二叉树中度数为 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 ...
- 【数据结构】求以孩子兄弟表示法存储的森林的叶子结点数,树高
1.求叶子结点数 T的第一个孩子存在T->firstChild里,所以如果T连第一个孩子都没有,那肯定为叶子结点,也就是说T->firstChild==NULL. 所以说,以孩子兄弟表示法 ...
- C++数据结构与算法—用递归方法求二叉树的叶子结点数
用递归方法写一个算法,求二叉树的叶子结点数int leafnum(BTREE T). 要求: 1.定义二叉树的抽象数据类型和型BTREE,并定义基本操作. 2.编写函数1eafnum(BTREE T, ...
- 代码实现求二叉树结点数和叶子结点数(C语言)
本篇会用到之前讲过的二叉树三种遍历方法的代码实现,当然这里还会再写一遍,可以先去看这篇博客二叉树的概念及三种遍历方法(C语言)_Perfectkn的博客-CSDN博客 目录 两种方法求二叉树结点总个数 ...
- c语言二叉树结点 深度,求二叉树的深度、总结点数和叶子结点数
二叉树的二叉链表的存储结构: typedef char TElemType; typedef struct BiTNode { TElemType data;//数据元素 BiTNo ...
最新文章
- Linux学习笔记(一)Linux常用命令
- Java线程6个状态详解
- dnf安徒恩服务器不稳定,DNF安图恩掉线怎么办 INS安图恩攻坚战不惧掉线
- kafka相关名称介绍
- csdn相册超出了20m了,怎么办?求助
- C语言和设计模式(解释器模式)
- MySQL保存计算结果_在数据库中保存计算结果如何对应到相应的工程文件
- 2017年英国机器人周:身体有问题 就找机器人
- Mish:一个新的state of the art的激活函数,ReLU的继任者
- 软件测试中什么是正交分析法,软件测试用例设计方法之正交分析法
- ctfmon是什么启动项_win10系统启动项中没有ctfmon进程的图文方法
- android助手盒子版,小米盒子助手
- 使用usb有线网卡u-boot无法ping通虚拟机
- 项目管理术语英汉对照表
- matlab模型预测控制基本原理,matlab模型预测控制
- Python文本挖掘练习(一)// 新闻摘要
- 联邦学习纵向逻辑回归公式推导
- Python生成城市热力图
- TiDB 在零氪科技(LinkDoc)大数据医疗系统的实践
- Oracle——SQL基础练习
热门文章
- 印度首次挑战登月告败,一步之遥≈多大差距?
- 2019年中国科创板全面解读报告
- 超级干货:一文看懂5G产业链及投资机会
- 下一次工业革命:计算生物学与生物平台
- 平均 15189 元!2021 年 3 月程序员工资统计出炉
- @程序员,什么才是“2020-1024”的正确打开姿势?
- 又跌了!7 月程序员工资平均 14357 元 | 原力计划
- clickhouse修改时区
- Sublime Text3常用插件以及安装方法(实用)
- How to use nheqminer in RedHat based systems (CentOS/Fedora)