二叉树进阶:平衡二叉树、完全二叉树、满二叉树详解
在上一篇博客中,我们介绍了二叉树的基本概念、遍历方式以及常见操作。本篇将深入探讨二叉树的几种特殊类型:平衡二叉树、完全二叉树和满二叉树,并通过Java代码示例帮助大家更好地理解这些概念。
1. 满二叉树 (Full Binary Tree)
定义
满二叉树是指一棵二叉树中,**每个节点都有0个或2个子节点**。换句话说,除了叶子节点外,每个节点都有两个子节点。
特点
- 叶子节点只能出现在最底层。
- 非叶子节点的度(子节点数)必须为2。
- 如果树的高度为`h`,则节点总数为 `2^h - 1`。
示例
1/ \2 3/ \ / \4 5 6 7
这是一棵高度为3的满二叉树,节点总数为 `2^3 - 1 = 7`。
Java代码:判断满二叉树
public boolean isFullBinaryTree(TreeNode root) {if (root == null) {return true; // 空树是满二叉树}// 如果左右子树都为空,则是叶子节点if (root.left == null && root.right == null) {return true;}// 如果左右子树都不为空,则递归检查if (root.left != null && root.right != null) {return isFullBinaryTree(root.left) && isFullBinaryTree(root.right);}// 其他情况(一个子节点为空,另一个不为空)不是满二叉树return false;
}
2. 完全二叉树 (Complete Binary Tree)
定义
完全二叉树是指一棵二叉树中,**除了最后一层外,其他层都是满的,并且最后一层的节点都靠左排列。
特点
- 叶子节点只能出现在最底层或次底层。
- 最后一层的节点从左到右连续排列,不能有空缺。
- 常用于实现堆(如优先队列)。
示例
1/ \2 3/ \ /4 5 6
这是一棵完全二叉树,最后一层的节点靠左排列。Java代码:判断完全二叉树
import java.util.LinkedList;
import java.util.Queue;public boolean isCompleteBinaryTree(TreeNode root) {if (root == null) {return true; // 空树是完全二叉树}Queue<TreeNode> queue = new LinkedList<>();queue.offer(root);boolean hasNullNode = false; // 标记是否遇到空节点while (!queue.isEmpty()) {TreeNode current = queue.poll();if (current == null) {hasNullNode = true; // 遇到空节点} else {if (hasNullNode) {return false; // 如果之前有空节点,当前节点不为空,则不是完全二叉树}queue.offer(current.left);queue.offer(current.right);}}return true;
}
3. 平衡二叉树 (Balanced Binary Tree)
定义
平衡二叉树是指一棵二叉树中,**每个节点的左右子树高度差不超过1**。平衡二叉树的主要目的是保证树的查询效率,避免退化为链表。
特点
- 每个节点的左右子树高度差不超过1。
- 常见的平衡二叉树有AVL树和红黑树。
- 插入和删除操作可能需要调整树的结构以保持平衡。
1/ \2 3/ \ \4 5 6
这是一棵平衡二叉树,每个节点的左右子树高度差不超过1。Java代码:判断平衡二叉树
public boolean isBalanced(TreeNode root) {return getHeight(root) != -1;
}private int getHeight(TreeNode root) {if (root == null) {return 0; // 空树高度为0}int leftHeight = getHeight(root.left);int rightHeight = getHeight(root.right);// 如果左右子树不平衡,返回-1if (leftHeight == -1 || rightHeight == -1 || Math.abs(leftHeight - rightHeight) > 1) {return -1;}// 返回当前树的高度return Math.max(leftHeight, rightHeight) + 1;
}
4. 二叉搜索树 (Binary Search Tree, BST)
定义
二叉搜索树是一种特殊的二叉树,满足以下性质:
- 左子树的所有节点值小于根节点的值。
- 右子树的所有节点值大于根节点的值。
- 左右子树也分别是二叉搜索树。
特点
- 中序遍历结果是一个有序序列。
- 查找、插入和删除的平均时间复杂度为 `O(log n)`。
示例
4/ \2 6/ \ / \1 3 5 7
这是一棵二叉搜索树,中序遍历结果为 `[1, 2, 3, 4, 5, 6, 7]`。 Java代码:判断二叉搜索树
public boolean isBST(TreeNode root) {return isBSTUtil(root, Long.MIN_VALUE, Long.MAX_VALUE);
}private boolean isBSTUtil(TreeNode root, long min, long max) {if (root == null) {return true;}if (root.val <= min || root.val >= max) {return false;}return isBSTUtil(root.left, min, root.val) && isBSTUtil(root.right, root.val, max);
}
5. 总结
满二叉树:每个节点都有0个或2个子节点。
完全二叉树:除了最后一层,其他层都是满的,最后一层节点靠左排列。
平衡二叉树:每个节点的左右子树高度差不超过1。
二叉搜索树:左子树小于根节点,右子树大于根节点。
这些特殊的二叉树在实际开发中有着广泛的应用,例如:
堆(完全二叉树)用于实现优先队列。
AVL树和红黑树(平衡二叉树)用于高效的数据查找和插入。
二叉搜索树用于排序和搜索。
6. 参考资料
- 《算法导论》
- 《数据结构与算法分析》
- LeetCode二叉树相关题目
如果你对二叉树的这些特殊类型有任何疑问,或者想了解更多细节,欢迎在评论区留言!
相关文章:
二叉树进阶:平衡二叉树、完全二叉树、满二叉树详解
在上一篇博客中,我们介绍了二叉树的基本概念、遍历方式以及常见操作。本篇将深入探讨二叉树的几种特殊类型:平衡二叉树、完全二叉树和满二叉树,并通过Java代码示例帮助大家更好地理解这些概念。 1. 满二叉树 (Full Binary Tree) 定义 满二叉…...
【免费送书活动】《MySQL 9从入门到性能优化(视频教学版)》
本博主免费赠送读者3本书,书名为《MySQL 9从入门到性能优化(视频教学版)》。 《MySQL 9从入门到性能优化(视频教学版)(数据库技术丛书)》(王英英)【摘要 书评 试读】- 京东图书 这本书已经公开…...
【人工智能】通过python练习机器学习中的8大算法
python一系列练习在前面几节中基本练习了一遍,本篇通过机器学习的算法加强python的训练。我印象中常用的几种算法有:线性回归、逻辑回归,决策树,向量机SVM,KNN-近邻,朴素贝叶斯,K-means…...
机器学习数学基础:21.特征值与特征向量
一、引言 在现代科学与工程的众多领域中,线性代数扮演着举足轻重的角色。其中,特征值、特征向量以及相似对角化的概念和方法,不仅是线性代数理论体系的核心部分,更是解决实际问题的有力工具。无论是在物理学中描述系统的振动模式…...
Android Studio2024版本安装环境SDK、Gradle配置
一、软件版本,安装包附上 👉android-studio-2024.1.2.12-windows.exe👈 👉百度网盘Android Studio安装包👈 (若下载连链接失效可去百度网盘链接下载) 二、软件安装过程 三、准备运行…...
RabbitMQ学习—day2—安装
目录 普通Linux安装 安装RabbitMQ 1、下载 2、安装 3. Web管理界面及授权操作 Docker 安装 强力推荐学docker,使用docker安装 普通Linux安装 安装RabbitMQ 1、下载 官网下载地址:https://www.rabbitmq.com/download.html(opens new window) 这…...
Jenkins 新建配置Pipeline任务 三
Jenkins 新建配置Pipeline任务 三 一. 登录 Jenkins 网页输入 http://localhost:8080 输入账号、密码登录 一个没有创建任务的空 Jenkins 二. 创建 任务 图 NewItem 界面左上角 New Item 图NewItemSelect 1.Enter an item name:输入任务名 2.Select an ite…...
社区版IDEA中配置TomCat(详细版)
文章目录 1、下载Smart TomCat2、配置TomCat3、运行代码 1、下载Smart TomCat 由于小编的是社区版,没有自带的tomcat server,所以在设置的插件里面搜索,安装第一个(注意:安装时一定要关闭外网,小编因为这个…...
FFmpeg Audio options
ffmpeg音频命令选项: 1. -aframes number (output) 设置输出音频帧的数量。这是一个已经过时的别名,应该使用 -frames:a 参数来代替。 示例: ffmpeg -i input.mp4 -frames:a 300 output.mp4 表示输出300帧音频 2. -ar[:stream_specifier] freq (in…...
MATLAB 生成脉冲序列 pulstran函数使用详解
MATLAB 生成脉冲序列 pulstran函数使用详解 目录 前言 一、参数说明 二、示例一 三、示例二 总结 前言 MATLAB中的pulstran函数用于生成脉冲序列,支持连续或离散脉冲。该函数通过将原型脉冲延迟并相加,生成脉冲序列,适用于信号处理和系统…...
概率论、组合数学知识点汇总
1、概率论知识点 全概率公式:如果事件B1,B2,…,Bn是样本空间的一个划分,则:贝叶斯定理:协方差:协方差用来衡量两个变量之间的变化趋势是否一致,公式为相关系数(Pearson):…...
【人工智能】deepseek R1模型在蓝耘智算平台的搭建与机器学习的探索
📝个人主页🌹:Eternity._ 🌹🌹期待您的关注 🌹🌹 ❀ 蓝耘智算平台 deepseek R1简介与优点蓝耘智算平台蓝耘智算平台简介蓝耘智算平台优势deepseek R1模型在蓝耘智算平台的搭建模型使用与机器学习…...
tomcat html乱码
web tomcat html中文乱码 将html文件改成jsp <% page language"java" contentType"text/html; charsetUTF-8" pageEncoding"UTF-8"%>添加 <meta charset"UTF-8">...
蓝桥杯算法日记|2.11二分算法
二分法是一种在有序数组中查找某一特定元素的搜索算法。二分法的基本思想是:每次将区间缩小一半,重复这个过程,直到找到目标值或者确定目标值不存在于该区间内。 整数二分、浮点二分、二分答案 退出条件:l、r相邻时候退出 #inclu…...
基于单片机的智能奶茶机(论文+源码+图纸)
1总体架构设计 本课题为基于单片机的智能奶茶机设计,其系统架构上设计如图2.1所示,整个系统包括了DS18B20温度传感器、继电器模块、LCD液晶、蜂鸣器、按键、STC89C52单片机等器件,在功能上用户可以通过按键键控制选择甜度和添加物以及设置温度…...
Centos7系统安装redis
Centos7系统安装redis 下载编译配置配置环境变量服务脚本安装使用远程连接 下载 下载地址:https://download.redis.io/releases/,选择版本6.2.7 具体下载链接:https://download.redis.io/releases/redis-6.2.7.tar.gz 操作:在ro…...
图数据库neo4j进阶(一):csv文件导入节点及关系
CSV 一、load csv二、neo4j-admin import<一>、导入入口<二>、文件准备<三>、命令详解 一、load csv 在neo4j Browser中使用Cypher语句LOAD CSV,对于数据量比较大的情况,建议先运行create constraint语句来生成约束 create constraint for (s:Student) req…...
langchain学习笔记之小样本提示词Few-shot Prompt Template
langchain学习笔记之小样本提示词 引言 Few-shot Prompt Templates \text{Few-shot Prompt Templates} Few-shot Prompt Templates简单介绍示例集创建创建 ExamplePrompt \text{ExamplePrompt} ExamplePrompt与 ExampleSelector \text{ExampleSelector} ExampleSelector创建 Fe…...
【认证授权FAQ】HP Anyware LLS服务器常用命令
pcoip-set-password //lls上设置管理员密码 export HISTIGNORE“export” export TERADICI_LICENSE_SERVER_PASSWORD‘Your Password’ sudo pcoip-configure-proxy -v //检查是否使用了代理 pcoip-activate-online-license -a -c //在线激活 pcoip-return-online-license -a …...
深度剖析责任链模式
一、责任链模式的本质:灵活可扩展的流水线处理 责任链模式(Chain of Responsibility Pattern)是行为型设计模式的代表,其核心思想是将请求的发送者与接收者解耦,允许多个对象都有机会处理请求。这种模式完美解决了以下…...
Windows中指定路径安装DockerDesktop
Widnows中直接安装docker desktop,默认会被安装到C:/Program Files/Docker路径下,可以通过下面方式来设置安装到指定的目录下 1. 先卸载干净(如果已安装过的话) 如果未卸载干净,重装会提示 Exising installation is up to date 卸载Docker…...
Java LinkedList(单列集合)
LinkedList 是 Java 中实现了 List 接口的一个类,它属于 java.util 包。与 ArrayList 不同,LinkedList 是基于双向链表实现的,适合于频繁进行插入和删除操作的场景。 1. LinkedList 的基本特性 基于链表实现:LinkedList 使用双向…...
海外服务器都有什么作用?
海外服务器具体就是指部署在中国大陆以外地区的服务器,企业选择租用海外服务器能够显著提高不同国家和地区用户的访问速度,当网站的服务器部署在目标用户所在地附近时,数据信息所传输的距离就会缩短,大大降低了网络访问的延迟度&a…...
floodfill算法系列一>岛屿的最大面积
题解 整体思路:代码设计:代码呈现: 整体思路: 代码设计: 代码呈现: class Solution {int ret,m,n,count;boolean[][] vis;public int maxAreaOfIsland(int[][] grid) {m grid.length;n grid[0].length;v…...
手机用流量怎样设置代理ip?
互联网各领域资料分享专区(不定期更新): Sheet...
2025年2月13日笔记
——自定义函数: #include<iostream> #include<bits/stdc.h> using namespace std; int a(int x,int y); int a(int x,int y){ return x*y; } int main(){ int c5; int d3; int resulta(c,d); cout<<"两数的乘积是:"&…...
游戏引擎学习第100天
仓库:https://gitee.com/mrxiao_com/2d_game_2 昨天的回顾 今天的工作重点是继续进行反射计算的实现。昨天,我们开始了反射和环境贴图的工作,成功地根据法线显示了反射效果。然而,我们还没有实现反射向量的计算,导致反射交点的代…...
Leetcode:学习记录
一、滑动窗口 1. 找出数组中元素和大于给定值的子数组的最小长度 右指针从左到右遍历,在每个右指针下,如果去掉左边元素的元素和大于等于给定值则左指针右移一次,直到小于给定值,右指针右移一个。 2.找到乘积小于给定值的子数组…...
AT32系列微控制器低压电机控制开发板
参考:《UM0014_AT32_LV_Motor_Control_EVB_V20_User_Manual_V1.0.1_ZH.pdf》 开发板介绍 此电机开发板是一个泛用型的低压三相电机驱动器,应用雅特力科技AT32系列微控制器搭配雅特力电机函数库,可驱动直流无刷电机、交流同步电机࿰…...
如何保持 mysql 和 redis 中数据的一致性?PegaDB 给出答案
MySQL 与 Redis 数据保持一致性是一个常见且复杂的问题,一般来说需要结合多种策略来平衡性能与一致性。 传统的解决策略是先读缓存,未命中则读数据库并回填缓存,但方式这种维护成本较高。 随着云数据库技术的发展,目前国内云厂商…...
