遍历完全二叉树节点

news2024/11/19 19:35:26

完全二叉树的节点个数

  1. 递归普通二叉树遍历解法

    • 我们先来普及一下完全二叉树的概念:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。

    • 这种解法是最简单在运行时间和速度空间上都很快,如果想不到完全二叉树的性质可以使用这种方法无脑遍历,无脑来解这道题。

    • 大概思路就是分别递归遍历左右节点直到节点为nil为止。

    • 由于代码思路很简单,我们直接看代码。

    type TreeNode struct {
      Val   int
      Left  *TreeNode
      Right *TreeNode
    }
    ​
    func countNodes(root *TreeNode) int {
      if root == nil {
        return 0
      }
      res := 1
      if root.Right != nil {
        res += countNodes(root.Right)
      }
      if root.Left != nil {
        res += countNodes(root.Left)
      }
      return res
    }

    完全二叉树

使用普通二叉树的遍历方法的时间复杂度为On 这样的复杂度,还行!!!

  1. 利用完全二叉树的特性来计算节点数量

    • 上面我们介绍了完全二叉树的特性:我们知道了一棵完全二叉树末尾节点只会从左边依次排开,不会出现右节点存在,左节点不存在的情况,所以我们利用这个特性,来遍历这个二叉树。

    • 假设存在满二叉树的情况,那么计算公式就为2h-1,所以我们只用判断最左边子二叉树的深度和最右边子二叉树的深度是否相等,如果相等就是满二叉树我们使用公式计算即可,如果不相等继续向下遍历。

    • 代码如下,虽然时间复杂度也是On但是当节点数量增多的时候会省去好多不必要的计算。

    type TreeNode struct {
      Val   int
      Left  *TreeNode
      Right *TreeNode
    }
    ​
    func countNodes(root *TreeNode) int {
      if root == nil {
        return 0
      }
      left := root.Left
      right := root.Right
      leftLight := 0
      rightLigh := 0
      for left != nil {
        left = left.Left
        leftLight++
      }
      for right != nil {
        right = right.Right
        rightLigh++
      }
      //满二叉树的情况
      if leftLight == rightLigh {
        return (2 << leftLight) - 1 //计算节点的数量
      }
      leftNumber := countNodes(root.Left)
      rightNumber := countNodes(root.Right)
      result := leftNumber + rightNumber + 1
      return result
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1116963.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言之排序

1.冒泡排序 冒泡排序就不多说了&#xff0c;只需要两层循环嵌套&#xff0c;两两比较确定相对正确的顺序即可。 2.插入排序 插入排序的思想就是每一次向后寻找一个再将其与前面有序的部分进行对比&#xff0c;寻找合适位置插入。 这里关键要避免让前移超出目前读取的数字&…

Java版ORM最初雏形

经过一个晚上的加班&#xff0c;终于把ORM初步结构工程搭好了。工程依赖有点难用&#xff0c;编辑器提示比VS差很多。 首先LIS.Core创建一个最初的容器雏形&#xff0c;先能反射得到对象给ORM获得数据库驱动 然后ORM创建数据库驱动差异接口&#xff0c;不同数据库实现接口后配…

MATLAB中 tf2zpk函数用法

目录 语法 说明 示例 IIR滤波器的极点、零点和增益 tf2zpk函数的功能是将传递函数滤波器参数转换为零极点增益形式。 语法 [z,p,k] tf2zpk(b,a) 说明 [z, p, k] tf2zpk(b, a) 从传递函数参数 b 和 a 中找到零点矩阵 z&#xff0c;极点向量 p&#xff0c;以及相关的增益…

岗亭一键报警器设计

岗亭一键报警器设计 岗亭一键报警器设计人性化&#xff0c;拥有多种功能&#xff0c;例如&#xff1a; 紧急报警&#xff1a;遇到紧急情况时&#xff0c;只需按下报警器按钮&#xff0c;即可迅速向监控中心发送报警信号&#xff0c;以便相关人员及时采取应对措施。远程监控&am…

NLP:从头开始的文本矢量化方法

一、说明 NLP 项目使用文本&#xff0c;但机器学习算法不能使用文本&#xff0c;除非将其转换为数字表示。这种表示通常称为向量&#xff0c;它可以应用于文本的任何合理单位&#xff1a;单个标记、n-gram、句子、段落&#xff0c;甚至整个文档。 在整个语料库的统计 NLP 中&am…

EPLAN_007#3D图形的导入、编辑和定义

一定要打开对象捕捉&#xff0c;否则会严重偏移&#xff01;&#xff01;&#xff01; 一、导入3D模型&#xff0c;合并模型 1、新建一个宏项目 2、导入&#xff08;3D图形&#xff09; 可以对目标进行旋转查看 3、合并图形&#xff08;不建议合并&#xff09; 框选目标 点合并…

用python写一个贪吃蛇的程序能运行能用键盘控制

用python写一个贪吃蛇的程序能运行能用键盘控制 1.源码2.运行效果 1.源码 开发库使用&#xff1a;pygame random 直接在终端运行&#xff1a;pip install pygame pycharm安装库&#xff1a;文件-设置-项目-Python 解释器 import pygame import random# 初始化pygame pygame…

代码随想录算法训练营第五十九天 | 647. 回文子串、516.最长回文子序列

647. 回文子串 链接&#xff1a; 代码随想录 &#xff08;1&#xff09;代码 516.最长回文子序列 链接&#xff1a; 代码随想录 &#xff08;1&#xff09;代码

文件上传漏洞靶场前十关

pass1&#xff1a; 只能上传照片 用burp抓包改一下数据包试试&#xff1a; 上传成功 菜刀getshell Pass2&#xff1a; 寄 Png可以&#xff0c;抓包&#xff1a; 跟pass1一样阿 Pass3&#xff1a; 又寄 这里用抓包改数据包&#xff0c;发现仍然不可以 说明后端还有对文件名后缀…

springboot中@scheduled的使用

1.主要实现类ScheduledAnnotationBeanPostProcessor 在postProcessAfterInitialization(Object bean,String beanName)方法中找到所有bean中有注解为Scheduled的方法&#xff0c;组装成task,添加到调度线程池中 2.Task先按线程池接口类型TaskScheduler去容器中寻找taskSchedu…

freeipa server副本同步中断,两主节点数据不一致

/var/log/messages 和/var/log/dirsrv/slapd-testhadoop-COM 日志都出现以下日志: If replication stops, the consumer may need to be reinitialized. [27/Jun/2023:05:15:09.469361922 0800] - ERR - NSMMReplicationPlugin - changelog program - repl_plugin_name_cl - a…

【vue+nestjs】qq第三方授权登录【超详细】

项目场景&#xff1a; 前端使用vue3ts 后端使用nestjs 1.申请appId,appKey 1.进入qq互联官网。创建应用 特别注意 在填写网站回调域时,需要你线上真实能访问的。不然审核不通过。我的回调地址是前端路由地址 2.代码演示 特别注意: 如果你跟我一样是前后端分离的模式开发的…

17、监测数据采集物联网应用开发步骤(12.2)

阶段性源码将于本章节末尾给出下载 监测数据采集物联网应用开发步骤(12.1) 新建web数据接口http-request解析类com.zxy.tcp.Request.py #! python3 # -*- coding: utf-8 -Created on 2017年05月10日 author: zxyong 13738196011 import urllib.parse,json from com.zxy.comm…

华为OD机试 - 根据某条件聚类最少交换次数 - 滑动窗口(Java 2023 B卷 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷&#…

解决ubuntu系统运行pyside2或6的问题

解决ubuntu系统运行pyside2或6时出现的问题 当运行程序时&#xff0c;出现“qt.qpa.plugin: Could not load the Qt platform plugin “xcb” in “/usr/local/lib/python3.6/dist-packages/cv2/qt/plugins” even though it was found. This application failed to start bec…

全志R128软件配置——RTOS 软件包配置

RTOS 软件包配置 本文将介绍 RTOS 软件包、地址&#xff0c;内核配置等。 Kconfig 简介 有过 linux 内核开发经验的人&#xff0c;对 menuconfig 不会陌生。对于各类内核&#xff0c;只要是支持 menuconfig 配置界面&#xff0c;都是使用 Kconfig。 换言之&#xff1a; me…

c++_learning-c++标准库STL和boost库

c的标准库 STL标准库&#xff1a;#include<iostream>&#xff1a;#include<iomanip>&#xff1a;#include<cstdlib>&#xff1a;#include<cmath>&#xff1a;#include<tuple>&#xff1a;利用可变参数模板&#xff0c;借助“递归继承”或“递归组…

AD画板时,元器件跑到屏幕左下角,看不见啦,咋办?

解决办法&#xff1a; EDIT---------------->SELECT---------------->ALL 然后鼠标选中&#xff0c;整体移动----》OK

手机主流存储器件的分析与发展

一、前言 存储器件作为系统中存储数据的物理单元&#xff0c;承担着非常重要的责任&#xff0c;它的运行状态时刻影响着整个系统的运行效率&#xff0c;存储容量和数据安全。所以整个产业针对存储器件的寿命&#xff0c;稳定性&#xff0c;容量&#xff0c;性能以及价格等方面进…

紫光展锐携中国联通完成RedCap芯片V517孵化测试

近日&#xff0c;紫光展锐携手中国联通5G物联网OPENLAB开放实验室&#xff08;简称“OPENLAB实验室”&#xff09;共同完成RedCap芯片V517创新孵化&#xff0c;并实现在联通5G全频段3.5GHz、2.1GHz、900MHz下的端到端业务验证测试。 V517是一款基于紫光展锐5G成熟平台设计与研发…