3-3-完全二叉树结点数

摘要:
  如果完全二叉树的节点数为N,请实现时间复杂度低于O的解法。3因为是完全二叉树,所以可以分为根结点的左右子树计算节点个数。4首先求得该完全二叉树的深度h。5然后判断根结点的右子树的最左节点是否在深度h上,6如果在,则说明该完全二叉树的左子树为一个深度为h-1的满二叉树,7其结点个数有:2^(h-1)-1个,加上根结点,结点总个数为2^(h-1)。

题目描述:

给定一棵完全二叉树的头节点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 namespacestd;
17 
18 structTreeNode {
19     intval;
20     struct TreeNode *left;
21     struct TreeNode *right;
22     TreeNode(intx) :
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, inth){
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 intmain(){
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 }

免责声明:文章转载自《3-3-完全二叉树结点数》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇编程学习必备:C++ 学习的 11 本经典书籍推荐Linux系统登录:本地登录与远程登录下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

将txt、csv等文本文件导入Hive

将txt、csv等文本文件导入Hive目录将txt、csv等文本文件导入Hive00.数据在虚拟机外01.启动hadoop、hdfs02.将文件放置在hdfs目录下03.登录hive并进入指定数据库04.根据文件创建表05.执行导入语句00.数据在虚拟机外如果数据在虚拟机内,请跳过此步,直接执行接下来的操作。...

layui 学习笔记(四) 复杂表头前台Excel导出

merges':mergeConf,'!cols':colConf,'!rows‘:rowConf}});}@...

JS学习笔记(一)JS处理JSON数据

在数据传输过程中,json以文本的形式传输,也就是字符串,而JS则对json对象进行操作。因此,JSON对象和JSON字符串之间的相互转换是关键。如果系统提示您找不到toJSONString()和parseJSON()方法,则说明您的json包版本太低。...

docker.service启动失败:Unit not found的原因及解决办法

解决方案是删除/usr/lib/systemd/system/docker.service的[UNIT]中包含的dockersocket,然后重新加载systemctldaemon,最后是systemctlstartdocker.service。启动成功。在类似的情况下,docker.socket缺失,但新版本需要docker.seocket。这是因为Fla...

iview表格动态数据实现合并功能

需求原型:代码实现:html part:从'../../libs/c导入{MsgType,PublicType}...

bootstrap删除模态框弹出并询问是否删除【通用删除模态框】

divclass=“模态对话框”&gt;divclass=“modal header”&gt;spanaria hidden=“true”&gt;h4class=“模态标题”&gt;divclass=“modal body”&gt;divclass=“模态页脚”&gt;...