博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[nowCoder] 完全二叉树结点数
阅读量:5757 次
发布时间:2019-06-18

本文共 1105 字,大约阅读时间需要 3 分钟。

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

 

分析:遍历的话不管是前序、中序、后序还是层次都是O(N),低于O(N)只能是O(lgN),向二分方向努力。

完全二叉树:除最后一层外,每一层上的数均达到最大值;在最后一层上只缺少右边的若干。

 

只有最后一层不满,我们可以根据左子树的最右节点或者右字数的最左节点来判断左子树是不是满二叉树,

若左字树满,可用公式计算左字树的节点数2^(l-1), 总节点数n= 2^(l-1)+ 1(根节点)+递归右子树的节点数。

若左字树不满,可知右子树满,层数为l-2,可用公式计算左字树的节点数2^(l-2), 总节点数n= 2^(l-2)+ 1(根节点)+递归左子树的节点数。

 

判断左子树的最右节点或者右字数的最左节点是否存在可以从层数上来判断。。

 

class Solution {private:        int calcHeight(TreeNode *head)        {              int height = 0;            while(head)            {                  head = head->left;                height ++;            }              return height;        }      public:        int nodeNum(struct TreeNode* head)        {              if(head == NULL)                return 0;             int height = calcHeight(head);            //cout << "height\t" <
<< endl; if(calcHeight(head->right) == height - 1)//left sub-tree is full return (1 << (height - 1) )+ nodeNum(head->right); else// right sub-tree is full return (1 << (height - 2) )+ nodeNum(head->left); }};

 

转载地址:http://civkx.baihongyu.com/

你可能感兴趣的文章
Win 8创造颠覆性体验:预览版关键更新
查看>>
vim在多文件中复制粘贴内容
查看>>
Android ContentObserver
查看>>
文章“关于架构优化和设计,架构师必须知道的事情”
查看>>
疯狂java学习笔记1002---非静态内部类
查看>>
ISA2006实战系列之一:实战ISA三种客户端部署方案(上)
查看>>
TCP服务器
查看>>
U-Mail邮件系统与泛微OA系统一体化操作指南
查看>>
AC旁挂三层交换机管理ap,二层接入ap心得
查看>>
JS中比较数字大小
查看>>
springcloud 学习-eureka搭建-为eureka添加认证
查看>>
jQuery插件的开发
查看>>
基础,基础,还是基础之JAVA基础
查看>>
如何成为一个C++高级程序员
查看>>
ant android 打包签名和渠道
查看>>
一个简单的接口,被调用并同步给出响应的方法
查看>>
Hadoop序列化与压缩
查看>>
我的友情链接
查看>>
显式锁(第十三章)
查看>>
SCCM的证书配置PKI
查看>>