树在数据结构中占据了非常重要的位置,尤其是二叉树。经常是在java面试中必问的一个环节,而且二叉树的应用场景真的非常普遍,需要重点掌握好。

但是一直以来,很多同学对于二叉树的掌握都是不太全面。今天我就来谈谈二叉树,希望你喜欢这个Java数据结构与算法这个专题,认真看完后你会对二叉树会有一个比较完整的了解。

重点会谈到以下几点:

  • 二叉树
  • 二叉树的遍历方式
  • 二叉树有哪些种类
  • 满二叉树
  • 完全二叉树
  • 二叉搜索树
  • 平衡二叉树(AVL)
  • 左旋与右旋

一.什么是二叉树

二叉树:就是每个节点都只能有两个子节点的树结构,俗称 “大裤衩”,特别形象。

通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。

下图你一看就秒懂了。

二.二叉树遍历方式

2.1二叉树的遍历主要有三种:

1)先序遍历(根左右)

2)中序遍历(左根右)

3)后序遍历(左右根)

2.2 先序遍历(根左右)

我先从第一种先序遍历开始谈起,主要的遍历顺序如下:

1)先访问根结点

2)然后先序遍历左子树

3)然后先序遍历右子树

还是举例说明,先序遍历下图

如果按照先序(根左右)遍历,结果将为: ABDFECGHI

2.3 中序遍历(左根右)

1)先中序遍历左子树

2)然后是根结点

3)然后中序遍历右子树

还是举例说明,中序遍历同一颗二叉树

按照中序遍历(左根右),结果为: DBEFAGHCI

2.4 后序遍历

1)后序遍历左子树

2)后序遍历右子树

3)然后访问根节点

还是举例说明,后序遍历同一颗二叉树

按照后序遍历(左右根)结果为:DEFBHGICA

三.二叉树的种类

基本包含:

  • 满二叉树
  • 完全二叉树
  • 二叉搜索树
  • 平衡AVL树
  • 红黑树也属于AVL树

我先从满二叉树谈起。

3.1满二叉树

1)满二叉树

一棵树深度为k,2^k-1个节点的树是满二叉树

2)满二叉树的形态

3)满二叉树的特征

所有内部节点都有两个子节点,最底一层是叶子节点。

如果一颗树深度为h,最大层数为k,且深度与最大层数相同,即k=h;

第k层的结点数是:2^(k-1)

总结点数是:2^k-1 (2的k次方减一)

总节点数一定是奇数。

树高:h=log2(n+1)

3.2.完全二叉树

1)完全二叉树

若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第h 层所有的结点都连续集中在最左边,这就是完全二叉树。

2)完全二叉树的形态

3)完全二叉树的特征

深度为k的完全二叉树,至少有2^(k-1)个节点,至多有2^k-1个节点。

树高h=log2n + 1

满二叉树一定是完全二叉树,完全二叉树不一定是满二叉树

3.3.二叉查找/搜索/排序树-BST

1)二叉搜索树

二叉搜索树BST(Binary Search/ Sort Tree),也称为二叉查找树,二叉排序树

备注:下面我就以二叉搜索树来统称,但是你要知道二叉搜索树、二叉查找树、二叉排序树,其实是同一种树。

2)二叉搜索树的特点

  • 左子树上所有结点的值均小于等于它的根结点的值
  • 右子树上所有结点的值均大于等于它的根结点的值

3)二叉搜索树的优缺点

优点:查找速度快,二叉查找树比普通树查找更快

缺点:出现平衡问题

二叉搜索树在经过多次插入与删除后,有可能导致如下右图的结构:

搜索性能已经是线性的了,所以,使用二叉搜索树还要考虑尽可能保持上面左图的结构,和避免上面右图的结构,也就是所谓的“平衡”问题 。

4)二叉搜索树的时间复杂度

时间复杂度

二叉查找树比普通树查找更快,查找、插入、删除的时间复杂度为O(logN)。

缺点

二叉查找树有一种极端的情况,就是会变成一种线性链表似的结构,此时时间复杂度就变味了O(N),为了解决这种情况,所以出现了下面我即将谈到的二叉平衡树。

备注:时间复杂度

  • O(1):最低的时空复杂度,也就是耗时与输入数据大小无关,无论输入数据增大多少倍,耗时/耗空间都不变。哈希算法就是典型的O(1)时间复杂度,无论数据规模多大,都可以在一次计算后找到目标。
  • O(n):代表数据量增大几倍,耗时也增大几倍。比如常见的遍历算法。
  • O(logn):当数据增大n倍时,耗时增大logn倍(这里的log是以2为底的,比如,当数据增大256倍时,耗时只增大8倍,是比线性还要低的时间复杂度)。二分查找就是O(logn)的算法,每找一次排除一半的可能,256个数据中查找只要找8次就可以找到目标。

3.4.平衡二叉树(AVL树)

1)平衡二叉树

平衡二叉树全称平衡二叉搜索树,也叫AVL树,是一种自平衡的树,从上面二叉搜索树升级过来的,重点是改进了平衡问题。

2)平衡二叉树的特征

  • AVL树也规定了左结点小于根节点,右结点大于根节点。
  • 并且还规定了左子树和右子树的高度差不得超过1,这样保证了它不会成为线性的链表。

3)AVL树怎么解决平衡

主要就是通过左旋和右旋来解决,防止特殊情况下出现下面的线性结构。

所以通过下图的左旋和右旋来解决上面的平衡问题。

但也有对应的缺点,由于要维持自身的平衡,所以进行插入和删除结点操作的时候,需要对结点进行频繁的旋转。

4.结语

通过上述的介绍,已经对于二叉树有了初步的认识。本篇文章介绍的基础知识希望读者能够牢牢掌握,并且能够在脑海中建立一棵二叉树的模型,为后续学习数据结构与算法打好基础。

如果喜欢点个赞,后续我会持续写这个数据结构与算法专题。

看完三件事❤️

如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:

  1. 点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。
  2. 关注公众号 『 java烂猪皮 』,不定期分享原创知识。
  3. 同时可以期待后续文章ing

java 二叉树的高度_最全二叉树:完整详解二叉树的遍历以及完全二叉树等6种二叉树...相关推荐

  1. java虚拟机工作原理图_超“强”的图文详解-JVM虚拟机底层原理与调优实战

    今天我和大家分享一篇文章,文章上半部分为JVM底层原理 下半部分为调优实战 文章有点长,需要点耐心哦! 如果觉得看文章太难理解,就点击下面我投稿B站的jvm视频讲解. 还配有视频讲解:解密BATJ一线 ...

  2. 附加 集合数据_最全的实例详解:Python字符串、列表、元组、字典、集合的补充...

    本文内容主要介绍了Python字符串.列表.元组.字典.集合,结合实例形式详细分析了Python字符串.列表.元组.字典.集合常见函数使用方法及相关操作注意事项,需要的朋友可以参考下!!! 附加: p ...

  3. java 肌汉模式_设计模式之原型模式详解(附源代码)

    原型模式(Prototype Pattern) 原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. ...

  4. java三元表达式嵌套_三元运算符的嵌套详解:分别在JSTL、JavaScript和Java中

    用来完成简单的选择逻辑,即根据条件判断,从两个选择中选择一种执行. 使用格式: (条件表达式)?表达式1:表达式2: 运算规则:条件表达式  值为一个布尔值,当值为true的时候 执行表达式1   否 ...

  5. centos 卸载软件_一篇看懂!详解-Linux系统中安装软件的三种方法

    Linux系统中安装软件的三种方法 注:本文主要以CentOS为例介绍常用的安装方式,其他版本linux在文章底部 Linux系统中怎么安装软件,首先说一下应用程序与系统命令的区别: 1.文件位置 系 ...

  6. java list 元素去重_小猿圈Java开发之list按照元素某个字段去重详解

    小猿圈Java老师给大家分享一篇关于如何实现Java8中list按照元素的某个字段去重的详细介绍,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,下面我们一起来看一下吧. ...

  7. 数据仓库电商建模_真实电商数据仓库全流程开发详解,资源教程下载

    课程名称 Hadoop大数据视频教程-第一季:真实电商数据仓库全流程开发详解(共46讲),资源教程下载 课程目录 第一部分:数据仓库基础理论与技术圈 第一章:互联网电商大数据环境 第二章:商业智能与数 ...

  8. 数学建模_随机森林分类模型详解Python代码

    数学建模_随机森林分类模型详解Python代码 随机森林需要调整的参数有: (1) 决策树的个数 (2) 特征属性的个数 (3) 递归次数(即决策树的深度)''' from numpy import ...

  9. 【Linux开发】全面的framebuffer详解

    全面的framebuffer详解 一.FrameBuffer的原理 FrameBuffer 是出现在 2.2.xx 内核当中的一种驱动程序接口. Linux是工作在保护模式下,所以用户态进程是无法象D ...

最新文章

  1. mysql pt_GitHub - hcymysql/pt-kill: Percona PT-kill重构版(PHP)
  2. OpenCV2.3的cvCalcHist函数有问题?255级值总为0,索性自己写一个直方图计算函数,附源码
  3. 【JetPack】kotlin-android-extensions 插件 ( 视图绑定简单用法 )
  4. 像玩乐高一样,学会如何定义产品的商业模式
  5. HashMap和ConcurrentHashMap
  6. Android学习之简单地使用碎片
  7. 区块链/比特币基础知识
  8. HTML动画能在手机播放吗,如何使动画在手机中屏幕适配
  9. word文件打不开怎么办?显示的是:调试,发送错误报告,不发送
  10. C语言 switch语句来调用函数
  11. 怎么把彩色的照片变黑白色?
  12. 解决WiFi信号弱小妙招
  13. 和数集团首款自研虚拟数字人上线,“始祖龙”带你跨山海,链未来
  14. 如何隐藏电脑硬盘分区
  15. NTP网络时钟同步协议对计算机网络数据的重要性
  16. javascript正则表达式-姜威-专题视频课程
  17. 计算机二级电子商务考试内容,电子商务师考试内容
  18. ios label文字行间距_iOS 设置label的行间距教程
  19. 基于matlab的相干信号的doa 估计,基于空间平滑MUSIC算法的相干信号DOA估计(1)
  20. 【重磅】全行业事理图谱V3.0正式发布:基于实证的由因求果、由果溯因,因果路径发现

热门文章

  1. Ubuntu 通过apt安装VSCode
  2. java四类八种基本数据类型
  3. javaScript书写规范
  4. 服务器Context、虚拟主机配置(管理、配置)
  5. 在Ubuntu中安装MySQL (转载)
  6. 如果你还不明白Hello,World!
  7. ASP.NET服务器控件刷新后仍旧保持滚动位置
  8. AndroidStudio_安卓原生开发_sharedpreferences清空---Android原生开发工作笔记150
  9. 用MobaXterm远程连接Centos系统_使用技巧---Linux工作笔记047
  10. AndroidStudio安卓原生开发_activity之间复杂对象类型的数据传递---Android原生开发工作笔记92