【Java数据结构】二叉树到底是什么品种的树?以及二叉树有哪些基操(一)

简介: 笔记

树型结构


概念

1.png

树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:


有一个特殊的节点,称为根节点,根节点没有前驱节点

除根节点外,其余节点被分成M(M > 0)个互不相交的集合T1、T2、…、Tm,其中每一个集合 Ti (1 <= i

<= m) 又是一棵与树类似的子树。每棵子树的根节点有且只有一个前驱,可以有0个或多个后继

树是递归定义的。2.png3.png


节点的度: 一个节点含有的子树的个数称为该节点的度;


树的度: 一棵树中,最大的节点的度称为树的度;


叶子节点或终端节点: 度为0的节点称为叶节点;


双亲节点或父节点: 若一个节点含有子节点,则这个节点称为其子节点的父节点;


孩子节点或子节点: 一个节点含有的子树的根节点称为该节点的子节点;


根结点: 一棵树中,没有双亲结点的结点;


节点的层次: 从根开始定义起,根为第1层,根的子节点为第2层,以此类推;


4.png


树的高度或深度: 树中节点的最大层次;


非终端节点或分支节点: 度不为0的节点;


兄弟节点: 具有相同父节点的节点互称为兄弟节点;


堂兄弟节点: 双亲在同一层的节点互为堂兄弟;


节点的祖先: 从根到该节点所经分支上的所有节点;


子孙: 以某节点为根的子树中任一节点都称为该节点的子孙。


森林: 由m(m>=0)棵互不相交的树的集合称为森林


树的表示形式


树结构相对线性表就比较复杂了,要存储表示起来就比较麻烦了,实际中树有很多种表示方式,如:双亲表示法,孩子表示法、孩子兄弟表示法等等

这里就简单的了解其中最常用的孩子兄弟表示法。

class Node {
 int value; // 树中存储的数据
 Node firstChild; // 第一个孩子引用
 Node nextBrother; // 下一个兄弟引用
}

5.png


树的应用


  • 文件系统管理(目录和文件)等

6.png


二叉树(重头戏)


概念

7.png


一棵二叉树是结点的一个有限集合,该集合或者为空,或者是由一个根节点加上两棵别称为左子树和右子树的二叉树组成。


二叉树的特点:

  1. 每个结点最多有两棵子树,即二叉树不存在度大于 2 的结点
  2. 二叉树的子树有左右之分,其子树的次序不能颠倒,因此二叉树是有序树。


二叉树的基本形态

8.png


上图给出了几种特殊的二叉树形态,从左往右依次是:

空树、只有根节点的二叉树、节点只有左子树、节点只有右子树、节点的左右子树均存在

一般二叉树都是由上述基本形态结合而形成的。


两种特殊的二叉树:

满二叉树: 一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,如果一个二叉树的层数为K,且结点总数是2^k-1 ,则它就是满二叉树。

完全二叉树: 完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。 要注意的是满二叉树是一种特殊的完全二叉树。

9.png



二叉树的性质


若规定根节点的层数为1,则一棵非空二叉树的第i层上最多有2^(i-1) (i>0)个结点

若规定只有根节点的二叉树的深度为1,则深度为K的二叉树的最大结点数是2^k -1 (k>=0)

对任何一棵二叉树, 如果其叶结点个数为 n0, 度为2的非叶结点个数为 n2,则有n0=n2+1

具有n个结点的完全二叉树的深度k为log2(n+1) 向上取整

对于具有n个结点的完全二叉树,如果按照从上至下从左至右的顺序对所有节点从0开始编号,则对于序号为i的结点有:

①若i>0,双亲序号:(i-1)/2;i=0,i为根节点编号,无双亲节点

②若2i+1<n,左孩子序号:2i+1,否则无左孩子

③若2i+2<n,右孩子序号:2i+2,否则无右孩子

比如一道例题: 假设一棵完全二叉树中总共有1000个节点,则该二叉树中__500__ 个叶子节点,__ 500___ 个非叶子节点 , __ 1 __ 个节点只有左孩子 ,__0__个只有右孩子。

问题解析:


总共有多少层?k=log2(1000+1) =10层

如果是10层,那么放满也就是满二叉树,总共2^10-1 = 1023个节点,但是现在只有1000个,那么说明当前这个树,不是满二叉树

第10层肯定是没放满的!!!

说明第9层肯定放满了

那前9层共有多少个节点呢?2^9-1 = 511个

所以第10层有1000-511=489个节点,都是叶子节点

现在就要考虑一个问题,第10层的节点是由多少个第9层节点产生的?489/2=244.5取245个

第9层这一层有多少个节点?2^(9-1) = 256个

所以第9层有245个节点是有孩子的,其中有1个节点只有一个左孩子,所以第9层的叶子节点有256-245=11个,第9层第10层的叶子节点共有11+489 =500个




相关文章
|
30天前
|
Java
【Java集合类面试二十六】、介绍一下ArrayList的数据结构?
ArrayList是基于可动态扩展的数组实现的,支持快速随机访问,但在插入和删除操作时可能需要数组复制而性能较差。
|
13天前
|
存储 机器学习/深度学习
【数据结构】二叉树全攻略,从实现到应用详解
本文介绍了树形结构及其重要类型——二叉树。树由若干节点组成,具有层次关系。二叉树每个节点最多有两个子树,分为左子树和右子树。文中详细描述了二叉树的不同类型,如完全二叉树、满二叉树、平衡二叉树及搜索二叉树,并阐述了二叉树的基本性质与存储方式。此外,还介绍了二叉树的实现方法,包括节点定义、遍历方式(前序、中序、后序、层序遍历),并提供了多个示例代码,帮助理解二叉树的基本操作。
38 13
【数据结构】二叉树全攻略,从实现到应用详解
|
8天前
|
C语言
数据结构基础详解(C语言):图的基本概念_无向图_有向图_子图_生成树_生成森林_完全图
本文介绍了图的基本概念,包括图的定义、无向图与有向图、简单图与多重图等,并解释了顶点度、路径、连通性等相关术语。此外还讨论了子图、生成树、带权图及几种特殊形态的图,如完全图和树等。通过这些概念,读者可以更好地理解图论的基础知识。
|
10天前
|
存储 算法 C语言
数据结构基础详解(C语言): 二叉树的遍历_线索二叉树_树的存储结构_树与森林详解
本文从二叉树遍历入手,详细介绍了先序、中序和后序遍历方法,并探讨了如何构建二叉树及线索二叉树的概念。接着,文章讲解了树和森林的存储结构,特别是如何将树与森林转换为二叉树形式,以便利用二叉树的遍历方法。最后,讨论了树和森林的遍历算法,包括先根、后根和层次遍历。通过这些内容,读者可以全面了解二叉树及其相关概念。
|
10天前
|
存储 机器学习/深度学习 C语言
数据结构基础详解(C语言): 树与二叉树的基本类型与存储结构详解
本文介绍了树和二叉树的基本概念及性质。树是由节点组成的层次结构,其中节点的度为其分支数量,树的度为树中最大节点度数。二叉树是一种特殊的树,其节点最多有两个子节点,具有多种性质,如叶子节点数与度为2的节点数之间的关系。此外,还介绍了二叉树的不同形态,包括满二叉树、完全二叉树、二叉排序树和平衡二叉树,并探讨了二叉树的顺序存储和链式存储结构。
|
10天前
|
存储 C语言
数据结构基础详解(C语言): 树与二叉树的应用_哈夫曼树与哈夫曼曼编码_并查集_二叉排序树_平衡二叉树
本文详细介绍了树与二叉树的应用,涵盖哈夫曼树与哈夫曼编码、并查集以及二叉排序树等内容。首先讲解了哈夫曼树的构造方法及其在数据压缩中的应用;接着介绍了并查集的基本概念、存储结构及优化方法;随后探讨了二叉排序树的定义、查找、插入和删除操作;最后阐述了平衡二叉树的概念及其在保证树平衡状态下的插入和删除操作。通过本文,读者可以全面了解树与二叉树在实际问题中的应用技巧和优化策略。
|
28天前
|
存储 Java
|
28天前
|
存储 Java
|
30天前
|
存储 算法 Java
"解锁Java对象数据结构的奥秘:从基础到实战,与热点技术共舞,让你的编程之路更激情四溢!"
【8月更文挑战第21天】Java以对象为核心,它是程序的基本单元与数据处理的基础。对象源自类,拥有属性(字段)和方法。对象在内存中分为对象头(含哈希码、GC信息等)和实例数据区(存储属性值)。例如,`Student`类定义了姓名、年龄等属性及相应的方法。通过`new`关键字实例化对象并调用其方法进行数据操作,是Java编程的关键技能。
27 0
|
8天前
|
存储 人工智能 C语言
数据结构基础详解(C语言): 栈的括号匹配(实战)与栈的表达式求值&&特殊矩阵的压缩存储
本文首先介绍了栈的应用之一——括号匹配,利用栈的特性实现左右括号的匹配检测。接着详细描述了南京理工大学的一道编程题,要求判断输入字符串中的括号是否正确匹配,并给出了完整的代码示例。此外,还探讨了栈在表达式求值中的应用,包括中缀、后缀和前缀表达式的转换与计算方法。最后,文章介绍了矩阵的压缩存储技术,涵盖对称矩阵、三角矩阵及稀疏矩阵的不同压缩存储策略,提高存储效率。