一颗完全二叉树,求其结点个数

求一颗完全二叉树的结点个数 一颗完全二叉树,要求时间复杂度小于O(n)的,算出这颗树的结点个数 解析 可以利用完全二叉树的性质进行求解,先计算左子树最大的深度,然后利用算出右子树最大深度,如果左子树和右子树最大深度相同,则左子树的结点可以求出(2^n-1);若左子树和右子树最大深度不同,则可以算出右子树的结点;然后依次递归求出右子树或左子树。. public int nodeNum(Node head){ ... 阅读详情

网上看了很多人的答案,都说最优解是o(n),想到了一种更快的算法,复杂度是O(lgn的平方),就是对左右子树进行二分,找最后一层的最右边那个结点即可:


#include <iostream>
#include <cmath>
#include <stdlib.h>

using namespace std;

struct Node {
  Node* left;
  Node* right;
  ~Node() {
    if (left) {
      delete left;
      left = NULL;
    }
    if (right) {
      delete right;
      right = NULL;
    }
  }
};

int GetDepth(Node* root) {
  int depth = 0;
  while (root) {
    depth++;
    root = root->left;
  }
  return depth;
}

void GetMostRightDepthAndIndex(Node* root, int* depth, int* index) {
  while (root) {
    if (root->right) {
      root = root->right;
      *index = (*index - 1) * 2;
      *index += 2;
      *depth += 1;
    } else if (root->left) {
      root = root->left;
      *index = (*index - 1) * 2;
      *index += 1;
      *depth += 1;
    } else {
      return;
    }
  }
}

void GetMostLeftDepthAndIndex(Node* root, int* depth, int* index) {
  while (root) {
    if (root->left) {
      root = root->left;
      *index = (*index - 1) * 2;
      *index += 1;
      *depth += 1;
    }
    else if (root->left) {
      root = root->right;
      *index = (*index - 1) * 2;
      *index += 2;
      *depth += 1;
    } else {
      return;
    }
  }
}

void GetNodeNum(Node* root, int cur_depth, int cur_index,
    int* node_num, int max_depth) {
  if (!root->left) {
    if (cur_depth - 1 >= 1) {
      *node_num += pow(2, cur_depth - 1) - 1;
    }
    *node_num += cur_index;
    return;
  }
  int ml_depth = root->left ? cur_depth + 1 : cur_depth;
  int ml_index = (cur_index - 1) * 2 + 1;
  int mr_depth = root->right ? cur_depth + 1 : cur_depth;
  int mr_index = (cur_index - 1) * 2 + 2;
  GetMostRightDepthAndIndex(root->left, &ml_depth, &ml_index);
  GetMostLeftDepthAndIndex(root->right, &mr_depth, &mr_index);
  if (ml_depth == mr_depth) {
    if (ml_depth == max_depth) {
      GetNodeNum(root->right, cur_depth + 1, (cur_index - 1) * 2 + 2,
          node_num, max_depth);
    } else if (ml_depth < max_depth) {
      GetNodeNum(root->left, cur_depth + 1, (cur_index - 1) * 2 + 1,
          node_num, max_depth);
    } else {
      std::cout << "illegal tree";
      exit(1);
    }
  } else if (ml_depth > mr_depth) {
    if (ml_depth == max_depth && mr_depth == max_depth - 1) {
      *node_num = pow(2, ml_depth - 1) - 1 + ml_index;
    }
  } else {
    std::cout << "illegal tree";
    exit(1);
  }
}

int main() {
  /* Input: create a  */
  // depth 1
  Node* root = new Node();
  // depth 2
  root->left = new Node();
  root->right = new Node();
  // depth 3
  root->left->left = new Node();
  root->left->right = new Node();
  root->right->left = new Node();
  root->right->right = new Node();
  // depth 4
  root->left->left->left = new Node();
  root->left->left->right= new Node();
  root->left->right->left = new Node();
  root->left->right->right = new Node();
  root->right->left->left = new Node();
  root->right->left->right = new Node();
  root->right->right->left = new Node();
  root->right->right->right = new Node();
  // depth 5
  root->left->left->left->left = new Node();

  int root_depth = 1;
  int root_index = 1;
  int max_depth = GetDepth(root);
  int node_num = 0;
  GetNodeNum(root, root_depth, root_index, &node_num, max_depth);
  std::cout << "node_num = " << node_num << endl;
  delete root;
}




汽车零部件产线实战:C#上位机+YOLO实现螺栓装配到位视觉检测 本项目基于C#上位机+YOLOv8实现汽车零部件产线螺栓装配到位视觉检测,全程贴合产线实际场景,从硬件选型、安装调试,到模型训练、上位机开发,再到项目联调、优化扩展,均提供手把手实操指导,代码可直接复制使用,规避了工业视觉产线检测的高频踩坑点。 阅读详情

相关推荐

华为S5700三层交换机VLAN配置避坑指南:为什么你的VLAN间无法互通?

本文针对华为S5700三层交换机VLAN间无法互通的典型故障,提供深度排障指南。文章从数据转发原理入手,系统梳理了从物理链路、VLAN配置、VLANIF接口状态、路由表到ARP表、MTU及安全策略等全链路检查点,并给出了清晰的排查命令与流程,帮助网络工程师快速定位并解决VLAN间路由问题,实现稳定互通。

tt34567的博客 873

二叉树11:完全二叉树的节点个数

给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。 完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。

Ge_yangwen的博客 2393

STM32F103 超声波风速风向仪实战:0.1m/s精度风洞标定与OLED显示(附源码)

本文详细介绍了基于STM32F103的超声波风速风向仪设计与实现,通过超声波时间差测量技术实现0.1m/s高精度测量。文章涵盖硬件设计、算法实现、风洞标定及OLED显示等关键环节,提供完整源码,适用于气象监测、风力发电等领域。

weixin_42532938的博客 275

二叉树之求解节点个数类算法归纳

二叉树求解节点个数类一、求二叉树中节点总数二、求二叉树中度为0的节点个数三、求二叉树中度为1的节点个数四、求二叉树中度为2的节点个数五、求二叉树第k层节点个数六、结果展示 以此树为例: 一、求二叉树中节点总数 int getNodeNumRec(BiTree* T) { if (T == NULL) { return 0; } else { return getNodeNumRec(T->lchild) + getNodeNumRec(T->rchild) + 1 ; }

bradyM的博客 5732

[RK3399][Android7.1] 调试笔记 --- 编译GSL5680 touch提示错误

Platform: RK3399 OS: Android 7.1 Kernel: v4.4.83 现象: 之前在rk3288平台上使用过GSL5680的Touch,现在移植过来一直报如下错误: make[1]: `include/generated/vdso-offsets.h' is up to date. CHK include/generated/compi...

Kris Fei's blog 1056

利用VS2019编写安卓APP的步骤和所遇问题的解决办法

遇到了代码错误,这个可以将鼠标箭头置于错误代码处,这样VS2019给你解决办法,给的方法不能解决,并且读了程序都没有问题,那么你应该重启软件,这样还是不能解决,你尝试重新生成解决方案,还是不能解决有可能是运用的代码与当前版本不相符和、过时了,这个时候应当运用相应版本的代码。注:VS2019编写APP的空间不是很稳定,当你写的代码没有问题,但是出现了报错,可能是空间崩溃了,这个时候可以重启软件。点击“+”号,创建密钥存储,输入“别名”、“密码”、以及下面中的任意一项,直至红色框消失后。

youbestcando的博客 7813

求二叉树的节点个数

如果是空树,则结点个数为0,递归结束 否则结点个数为左子树的结点个数+右子树的结点个数+1 【算法描述】 int NodeCount(BiTree T) { if (T == NULL) return 0; // 如果是空树,则结点个数为0,递归结束 else return NodeCount(T->lchild) + NodeCount(T->rchild) + 1; //否则结点个数为左子树的结点个数+右子树的结点个数+1 } 具体代

qq_47142993的博客 1万+

PyMiMi实战指南:midas_api配置与连接测试详解

本文详细介绍了PyMiMi库中midas_api的配置与连接测试全流程。从环境准备、API密钥获取,到核心的url_cfg配置函数使用,再到通过test_url进行连接验证,提供了清晰的步骤和代码示例。文章重点解析了配置原理、常见错误排查方法(如401错误、连接超时),并强调了API密钥的安全性管理,帮助用户稳固建立Python与Midas Civil NX之间的自动化通信桥梁。

weixin_29044713的博客 697

二叉树——222.完全二叉树的节点个数(递归+迭代)

222. 完全二叉树的节点个数 给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。 完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。 提示: 树中节点的数目范围是[0, 5 * 104] 0 <= Node.val <= 5 * 104 题目数据保证输入的树是完全二叉树 解题思路:这个题解题思路可以分为两种...

getinobacar的博客 2505

使用MATLAB进行灰色预测 GM(1,1)

使用MATLAB进行灰色预测 GM(1,1)

Hou_____的博客 997

LeRobot — 基于 PyTorch 的真实世界机器人学习框架(一)- 核心框架模块解析

LeRobot 是一个开源的机器人学习框架,由 Hugging Face 开发,旨在降低机器人学的准入门槛。该框架提供完整的机器学习流程支持,包括数据采集、训练、评估和部署。核心模块涵盖数据集标准化、策略算法、硬件抽象和强化学习组件,采用模块化设计实现灵活扩展。通过集成 Hugging Face Hub,用户可以轻松共享数据集和预训练模型。LeRobot 特别注重真实世界的机器人应用,支持多种前沿算法如模仿学习、视觉语言动作模型等,并提供统一的硬件接口和仿真环境适配。

熊猫小妖的AI世界 171

完全二叉树的结点数

完全二叉树有一个关于结点数的性质: 结点从1开始编号,层序。那么分每一个结点(编号为i)的左孩子结点是2i,右孩子结点编号是2i+1. 反之,根据孩子结点的编号可以推知父结点的编号:孩子结点编号的一半取整。下面是一个应用的例子: 一棵完全二叉树有1001个结点。其中叶结点的个数是几个? 分析: 1001个结点,则最后一个结点的编号是1001,那么它的父亲结点编号是500,注意,这个并不一

m0_37701448的博客 5541

MFC实现图书管理系统(附完整源码)

MFC实现图书管理系统(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 801

已知一棵完全二叉树,求其节点的个数

已知一棵完全二叉树,求其节点个数。 要求:时间复杂度低于 O(N),N为这棵树的节点个数 已知,如果一棵满二叉树的高度为l,则它的节点个数为2^l-1 如下的一棵完全二叉树 因为是完全二叉树,所以只要通过遍历它的左边界,就能知道它的层数H,代价为O(logN) 然后遍历头节点右子树的左边界,如果右子树的左边界到了最后一层,说明左子树是满的,所以左树的节点数就能确定,是2^(H-1)-1,再加上头节点,就是2^(H-1)个,剩下右树也是完全二叉树,递归,求右树的节点数。 另一种情况,右子树的左边界没到最

qq_45797026的博客 1517

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

[2011]若一棵完全二叉树有768个结点,则该二叉树中叶结点的个数是()

一道比较典型的题目

m0_74200587的博客 1413

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【数据结构】二叉树的基本操作大全,学会二叉树基本操作这一篇就够了:二叉树前序、中序、后序、层次遍历;求二叉树总结点个数,叶子结点个数,二叉树第k层的结点个数;求二叉树的高度;在二叉树中查找值为x的结点

【数据结构】二叉树的基本操作大全,学会二叉树基本操作这一篇就够了:二叉树前序、中序、后序、层次遍历;求二叉树总结点个数,叶子结点个数,二叉树第k层的结点个数;求二叉树的高度;在二叉树中查找值为x的结点

2301_76606232的博客 6022

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

判断一颗二叉树是否是完全二叉树

判断一颗二叉树是否是完全二叉树 方法一,采取标记的方法 非完全二叉树的三种情况 思路分析: 通过层序遍历来遍历树中的每一个非空结点 遍历到的每一个结点都分为四种情况 1.既有左孩子也有右孩子 操作:将左孩子和右孩子入队列 2.只有左孩子 操作: 1.首先判断标记是否处于激活状态,如果标记处于激活状态,直接返回 false 2.满足标记条件,将标记设置为激活状态 3.只有...

吃口雪花的博客 8272

设一棵完全二叉树具有1000个结点,则此完全二叉树有()叶子结点,有()个度为2的结点。

设一棵完全二叉树具有1000个结点,则此完全二叉树有()叶子结点,有()个度为2的结点。

Code_流苏:在代码中寻诗意,在实践中觅真知 4495

已知一颗完全二叉树,求其节点的个数

时间复杂度要求低于0(N),N为这棵树的节点个数 思路: 一颗完全二叉树L他的节点个数是2L-1; 对于一颗满二叉树,顺着他的左子树往下走,我们很快就能知道他的深度以及整棵树节点的大致个数那个区间, 然后在顺着头结点右孩子的左子树不停地走,当在深度那一层有节点的时候,那么整个左子树都是满的,因为我们知道深度那么这个时候左子树的个数就是确定的(2(L-1) - 1),递归去求右子数, 总结一下:整个...

cyyyyyh的博客 1223

已知一颗完全二叉树的第6层(设根为第一层)有8个叶结点,则该完全二叉树的结点个数最多为

已知一颗完全二叉树的第6层(设根为第一层)有8个叶结点,则该完全二叉树的结点个数最多为

weixin_49408416的博客 9242

二叉树详解(求二叉树的结点个数、深度、第k层的个数、遍历等)

对于二叉树,有一种特殊的情况,即一共有k层,前k-2层每个结点的度都是2,第k-1层若有个结点有子树,则其左侧的结点均有子树,这种情况被称为完全二叉树。二叉树,是一种特殊的树,特点是树的度小于等于2(树的度是整个树的结点的度的最大值),由于该特性,构建二叉树的结点只有三个成员,结点的值和指向结点左、右子树的指针。思路:对于每个结点,求左子树的结点的个数和右子树的结点的个数,再加上根节点,就是以当前结点为根的树的结点的个数。4.层序遍历:一层一层的访问,每一层都是先访问左侧的结点再访问右侧的。

yyssas的博客 1517

树与二叉树——二叉树中计算叶子结点个数问题

1、已知完全二叉树具有967个结点,则其叶子结点个数为: 详解: 首先明确一点该二叉树是一棵二叉树,那可以使用二叉树的一些性质。 从第一层开始计算每层的节点个数:1,2,4,8,16,32,64,128,256,512,1024... 将前9层的结点数量全部加起来有511个,如果加上第十层1024,则超过967,所以该完全二叉树肯定是有十层的,所以叶子结点分布在第9层和第10层,且第10层...

fu_jian_ping的博客 1万+

求完全二叉树的结点个数

第一次见这个题,看时间小于O(N)。。。。。 只能是二分啊。 但是怎么二分,条件是什么,真的想不到。   后来知道了,我们要找最深一层最右边那个结点。借此确定结点个数。   我们知道,满二叉树的结点个数和深度是有公式的,那么我们找到最后一层最右边的结点,其实就可以确定结点个数。 目标:找箭头指向的结点。   我们采用二分法: 1)找到右子树的最左结点 如果右子树深...

少说,多做。 7796

满二叉树与完全二叉树

满二叉树与完全二叉树满二叉树定义特点完全二叉树定义特点 满二叉树 定义 在一棵二叉树中,如果所有分支结点都有左、右孩子结点,并且叶子结点都集中在二叉树的最下层,这样的二叉树称为满二叉树。如下图所示就是一棵满二叉树。 用户可以对满二叉树的结点进行层序编号,约定编号从树根为1开始,按照层数从小到大、同一层从左到右的次序进行,图中每个结点旁的数字为对该结点的编号。 满二叉树也可以从结点个数和树的高度之间的关系来定义,即一棵高度为h且有2h-1个结点的二叉树称为满二叉树。 特点 ①、叶子结点都在最下一层 ②、只

muyuxifeng的博客 1万+

完全二叉树的结点个数

完全二叉树的结点个数 思路: 首先通过一直遍历节点的左节点,一直到最左下的结点,这就是二叉树的高度h,之后从根节点的右子树出发,找右子树的最左结点。 1.若右子树的最左结点处在h层上,说明根节点的左子树是一个高度为h-1的满二叉树,结点个数为2^(h-1)-1,之后+1(根节点),递归遍历根节点右子树。 2.若右子树的最左结点不在h层上,说明根节点的右子树是一个高度为h-2的满二叉树,同样上述计算...

amor_1的博客 4292
上一篇: 快速排序的改进算法
下一篇: 按层次打印二叉树元素
bobten2008
博客等级 码龄18年 153粉丝 157原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值