代码随想录:二叉树11-12

目录

222.完全二叉树的节点个数

题目

代码(层序迭代)

代码(后序递归)

代码(满二次树递归)

总结

110.平衡二叉树

题目

代码(后序递归)

代码(层序迭代)

代码(前序迭代)

总结


222.完全二叉树的节点个数

题目

给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。

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

示例 1:

输入:root = [1,2,3,4,5,6]
输出:6

代码(层序迭代)

class Solution {public int countNodes(TreeNode root) {//用层序迭代递归计算int size = 0; //初始大小为0Queue<TreeNode> que = new ArrayDeque<>();if(root == null){return 0;}que.offer(root);while(!que.isEmpty()){int len = que.size();  //获取当前层的节点个数size += len;  //更新size//当前层节点一个个出队while(len-- > 0){TreeNode cur = que.poll();//处理左右孩子,进队if(cur.left != null){que.offer(cur.left);}if(cur.right != null){que.offer(cur.right);}}}return size;}
}

代码(后序递归)

class Solution {public int countNodes(TreeNode root) {//用后序递归遍历计算//终止条件if(root == null){return 0;}//单层逻辑int left = countNodes(root.left); //计算左子树节点数量(左)int right = countNodes(root.right); //计算右子树节点数量(右)int result = left + right + 1; //中return result;}
}

代码(满二次树递归最难理解)

class Solution {//用完全二叉树的性质递归计算,时间复杂度小于o(n)//核心原理是如果是满二叉树,左右侧深度一样,可以2^depth-1直接计算,不用全部遍历public int countNodes(TreeNode root) {//终止条件1if(root == null){return 0;}//终止条件2,是满二叉树,可以直接根据深度计算节点数TreeNode left = root.left;TreeNode right = root.right;int leftdepth = 0;int rightdepth = 0;//左孩子一直往左下走,计算左下深度while(left != null){left = left.left;leftdepth++;}//右孩子一直往右下走,计算右下深度while(right != null){right = right.right;rightdepth++;}//如果左右深度一样,说明是满二叉树,直接计算返回if(leftdepth == rightdepth){//按注释计算2^depth-1 力扣上不知道为什么通不过//return ((int)Math.pow(2,leftdepth) - 1);return (2 << leftdepth) - 1;}//单层逻辑int l = countNodes(root.left); //计算左孩子节点数(左)int r = countNodes(root.right); //计算右孩子节点数(右)int result = l + r + 1; //中return result;}
}

总结

        层序迭代和后序递归的核心逻辑很简单,就是用普通的遍历二叉树的方法,一边遍历一边计算节点数,即在原先的遍历代码中加上计算节点数的代码即可。时间复杂度是o(n)。

        满二叉树递归的核心逻辑,利用了满二叉树的性质,如果一个子树的满二叉树,从根节点往左和往右的最大深度是一样的。因此我们通过前序递归遍历二叉树,如果当前节点时满二叉树(终止条件),就可以直接计算节点数是2^depth-1,不用继续遍历其孩子节点。如果不是满二叉树(单层逻辑),就继续前序遍历下去,不是满二叉树的节点数=左子树节点+右子树节点+1。时间复杂度<=o(n)。

110.平衡二叉树

题目

给定一个二叉树,判断它是否是平衡二叉树

示例 1:

输入:root = [3,9,20,null,null,15,7]
输出:true

代码(后序递归最难理解)

class Solution {//后序递归判断public boolean isBalanced(TreeNode root) {int result = postOrder(root);if(result == -1){return false;}else{return true;}}//后序遍历,判断每个节点是否满足高度差<=1//返回值int有两层意思:如果=-1代表当前节点不平衡,如果不是-1,代表当前节点的高度public int postOrder(TreeNode root){//终止条件1if(root == null){return 0;}//计算当前节点的左右孩子高度int leftheight = postOrder(root.left); //左子树高度int rightheight = postOrder(root.right); //右子树高度//终止条件2,左子树不平衡if(leftheight == -1){return -1;}//终止条件3,右子树不平衡if(rightheight == -1){return -1;}//终止条件4,左右子树高度差大于1if(Math.abs(leftheight - rightheight) > 1){return -1;}//单层循环//如果该节点满足平衡二叉条件,计算该节点的高度,继续递归判断int result = 1 + Math.max(leftheight,rightheight);return result;}
}

代码(层序迭代)

class Solution {//层序迭代判断,核心逻辑是层序遍历每个节点,判断是否满足平衡条件public boolean isBalanced(TreeNode root) {//层序遍历节点,逐个判断该节点是否满足高度差<=1Queue<TreeNode> que = new ArrayDeque<>();if(root == null){return true;}que.offer(root);while(!que.isEmpty()){int size = que.size();//处理当前层的所有节点while(size-- > 0){TreeNode cur = que.poll();//计算cur的左右孩子的高度int leftheight = getheight(cur.left);int rightheight = getheight(cur.right);//如果高度差>1,不满足平衡直接returnif(Math.abs(leftheight - rightheight) > 1){return false;}if(cur.left != null){que.offer(cur.left);}if(cur.right != null){que.offer(cur.right);}}}return true;}//计算cur节点的高度public int getheight(TreeNode cur){//终止条件if(cur == null){return 0;}//单层逻辑int left = getheight(cur.left);int right = getheight(cur.right);return 1 + Math.max(left,right);}
}

代码(前序迭代)

class Solution {public boolean isBalanced(TreeNode root) {Stack<TreeNode> stack = new Stack<>();if(root == null){return true;}//前序迭代遍历每一个节点,并判断该节点是否平衡stack.push(root);while(!stack.isEmpty()){TreeNode cur = stack.pop();//计算当前cur节点的左右高度int leftheight = getheight(cur.left);int rightheight = getheight(cur.right);//如果cur不平衡,直接返回falseif(Math.abs(leftheight - rightheight) > 1){return false;}if(cur.right != null){stack.push(cur.right);}if(cur.left != null){stack.push(cur.left);}}//遍历完全部节点,都满足平衡,就返回truereturn true;}//计算cur节点的高度public int getheight(TreeNode cur){//终止条件if(cur == null){return 0;}//单层逻辑int left = getheight(cur.left);int right = getheight(cur.right);return 1 + Math.max(left,right);}
}

总结

        迭代法的逻辑很简单,就是用前序、层序遍历每一个节点时,同时计算当前节点的左右孩子高度,判断当前节点的高度差是否满足平衡,如果不满足,直接返回false,如果当前节点满足,再迭代判断后面的节点。最后,如果所有节点遍历完,都没有返回false,说明二叉树的每一个节点都满足平衡条件,就返回true。

        递归法,核心逻辑是一边后序递归二叉树,一边计算当前节点的左右孩子高度,判断当前遍历节点是否满足平衡,如果不满足平衡就返回-1,如果满足平衡就计算当前节点的高度。

         递归法有四个终止条件,一是节点为null,返回0。二是节点的左右高度差>1,返回-1。还有两种情况千万不能漏,如果该节点的左孩子or右孩子的返回值=-1,说明其左孩子or右孩子已经不平衡了,直接返回-1。

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

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

相关文章

短视频批量采集提取软件|视频关键词下载工具

短视频批量采集软件&#xff1a;快速抓取、高效下载 一、开发背景 随着短视频平台的兴起&#xff0c;获取并分析相关视频内容已成为许多业务的必要步骤。然而&#xff0c;传统的手动方式无法满足快速、批量获取的需求&#xff0c;因此我们开发了一款专业的短视频批量采集软件。…

Linux内核之读、写信号量:up_read、up_write用法实例(五十三)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

ASP.NET基于WEB的工作计划流程管理系统的设计与实现

摘 要 信息技术的飞速发展&#xff0c;尤其是网络通讯技术、数据库技术及自动化技术的日新月异&#xff0c;为单位、企业的办公带来了极大的便利。但是由于单位、企业的工作性质众多&#xff0c;工作流程各有差异&#xff0c;企业、单位、部门之间的管理机制各不相同&#xf…

用队列实现栈(力扣第225题)

#include "stdio.h" #include "stdbool.h" #include "string.h" #include "stdlib.h" #include "assert.h"//初始化队列 typedef int QueueDataType;typedef struct queue {QueueDataType val;struct queue* next; }Qnode;t…

微信小程序地图polyline坐标太多异常显示BUG

描述 微信小程序map地图上显示polyline线&#xff0c;点位超过1250个出现bug&#xff0c;&#xff08;仅真机上出现&#xff0c;模拟器上正常&#xff09; 这里以加载四川省边界为例, 以下是示例代码 // 读取geojson数据 uni.request({url: https://geo.datav.aliyun.com/a…

openplc Linux 使用modbus RTU 从机通讯

1.Linux 环境下&#xff0c;openplc 默认使用的是modbus tcp协议通信。 想要使用串口 modbus rtu 通讯可以通过在runtime中添加SlaveDevices从机设备 2.添加设备&#xff0c;分配地址。 左边添加串口配置&#xff0c;右边是需要通讯的地址&#xff0c;从机地址都是从100开始&am…

yolov8 区域计数

yolov8 区域计数 1. 基础2. 计数功能2.1 计数模块2.2 判断模块 3. 主代码4. 实验结果5. 源码 1. 基础 本项目是在 WindowsYOLOV8环境配置 的基础上实现的&#xff0c;测距原理可见上边文章 2. 计数功能 2.1 计数模块 在指定区域内计数模块 def count_objects_in_region(bo…

STM32 堆栈内存以及变量存储分布

STM32的程序存储器、数据存储器、寄存器和输入输出端口被组织在同一个4GB的线性地址空间内, 地址范围为0x0000 0000至0xFFFF FFFF。其中FLASH为ROM类型&#xff0c;储存的数据掉电不易失&#xff1b;RAM中存储的数据掉电易失。以STM32F103系列为例&#xff0c;最多有512KB的FLA…

Discuz! X3.4 升级至 Discuz! X3.5 详细教程

第一步&#xff1a;从其他以前的 Discuz! X 版本升级Discuz! X3.4 请先升级到Discuz! X3.4&#xff0c;升级教程网上比较普遍&#xff0c;在此不再论述。 第二步&#xff1a;Discuz! X3.4 升级至 Discuz! X3.5 &#xff08;Discuz 从 X3.5 以后&#xff0c;不在发布GBK版本&…

【软考】UML中的图之类图

目录 1. 说明2. 图示3. 类图使用方式3.1 对系统的词汇建模3.2 对简单的协作建模3.3 对逻辑数据库模式建模 1. 说明 1.类图&#xff08;Class Diagram&#xff09;展现了一组对象、接口、协作和它们之间的关系。2.在面向对象系统的建模中所建立的最常见的图是类图。3.类图给出系…

离线数仓数据导出-hive数据同步到mysql

离线数仓数据导出-hive数据同步到mysql MySQL建库建表数据导出 为方便报表应用使用数据&#xff0c;需将ads各指标的统计结果导出到MySQL数据库中。 datax支持hive同步MySQL&#xff1a;仅仅支持hive存储的hdfs文件导出。所以reader选hdfs-reader&#xff0c;writer选mysql-wri…

怎样在外网登录访问CRM管理系统?

一、什么是CRM管理系统&#xff1f; Customer Relationship Management&#xff0c;简称CRM&#xff0c;指客户关系管理&#xff0c;是企业利用信息互联网技术&#xff0c;协调企业、顾客和服务上的交互&#xff0c;提升管理服务。为了企业信息安全以及使用方便&#xff0c;企业…

SSM小程序作品集展示微信小程序

采用技术 SSM小程序作品集展示微信小程序的设计与实现~ 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringMVCMyBatis 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 页面展示效果 用户功能 用户注册 用户首页 作品集 优秀作者 我的分享 管…

powershell@命令行提示符样式配置自定义@pwsh重写prompt显示电量内存时间等信息

文章目录 abstract流行的powershell prompt模块示例 powershell原生修改Prompt函数配置文档Prompt命令来自哪里 简单修改带上电量和时间的Prompt 复杂修改预览FAQ:没有必要修改相关仓库地址样式选择平衡样式花哨样式响应性能 小结 abstract 在 PowerShell 中&#xff0c;可以通…

CSDN积分和等级和 能创建专栏数量的关系。还差1000多分!

积分查询&#xff1a;CSDN 博客积分规则 博客积分是CSDN对用户努力的认可和奖励&#xff0c;也是衡量博客水平的重要标准。博客等级也将由博客积分唯一决定。积分规则具体如下&#xff1a; 1、每发布一篇原创或者翻译文章&#xff1a;可获得10分&#xff1b; 2、每发布一篇转载…

做一个答题pk小程序多少钱

在探讨“做一个答题pk小程序多少钱”这一问题时&#xff0c;我们首先需要明确的是&#xff0c;小程序的价格并非固定不变&#xff0c;而是受到多种因素的影响。这些因素包括但不限于小程序的复杂度、功能需求、开发周期、技术难度以及开发团队的规模和经验等。因此&#xff0c;…

Web前端 JavaScript笔记7

js的执行机制 js是单线程 同步&#xff1a;前面一个任务执行结束之后&#xff0c;执行后一个 异步&#xff1a;异步任务&#xff0c;引擎放在一边&#xff0c;不进入主线程&#xff0c;而进入任务队列的任务 js通过浏览器解析&#xff0c;浏览器靠引擎解析 回调函数同步任务执行…

LabVIEW卡尔曼滤波技术

LabVIEW卡尔曼滤波技术 在现代航空导航中&#xff0c;高精度和快速响应的方位解算对于航空安全至关重要。通过LabVIEW平台实现一种卡尔曼滤波方位解算修正技术&#xff0c;以改善传统导航设备在方位解算中的噪声干扰问题&#xff0c;从而提高其解算精度和效率。通过LabVIEW的强…

Java基础之JVM基础调优与常见问题

常见命令 以下命令的介绍&#xff0c;全部在jdk8环境下运行的&#xff1b; jps ☆☆☆☆☆ 查看当前运行的进程号&#xff1b; jmap ☆☆☆ jmap命令可以查看jvm的内存信息&#xff0c;class对应的实例个数以及占用的内存大小 jmap -histo 查看当前java进程 [rdVM-8-12-c…

Ugee手写板Ex08 S设置流程

手写笔的结构 笔尖 鼠标左键 上面第一个键&#xff1a;鼠标右键&#xff08;效果有时候也不完全等同&#xff09; 上面第二个键&#xff1a;鼠标中键 WPS ①打开pdf ②批注->随意画->画曲线 效果如下&#xff1a;