【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个




相关文章
|
14天前
|
存储 Java
Java中的HashMap和TreeMap,通过具体示例展示了它们在处理复杂数据结构问题时的应用。
【10月更文挑战第19天】本文详细介绍了Java中的HashMap和TreeMap,通过具体示例展示了它们在处理复杂数据结构问题时的应用。HashMap以其高效的插入、查找和删除操作著称,而TreeMap则擅长于保持元素的自然排序或自定义排序,两者各具优势,适用于不同的开发场景。
27 1
|
16天前
|
存储 Java
告别混乱!用Java Map优雅管理你的数据结构
【10月更文挑战第17天】在软件开发中,随着项目复杂度增加,数据结构的组织和管理至关重要。Java中的Map接口提供了一种优雅的解决方案,帮助我们高效、清晰地管理数据。本文通过在线购物平台的案例,展示了Map在商品管理、用户管理和订单管理中的具体应用,有效提升了代码质量和维护性。
59 2
|
16天前
|
存储 Java 开发者
Java Map实战:用HashMap和TreeMap轻松解决复杂数据结构问题!
【10月更文挑战第17天】本文深入探讨了Java中HashMap和TreeMap两种Map类型的特性和应用场景。HashMap基于哈希表实现,支持高效的数据操作且允许键值为null;TreeMap基于红黑树实现,支持自然排序或自定义排序,确保元素有序。文章通过具体示例展示了两者的实战应用,帮助开发者根据实际需求选择合适的数据结构,提高开发效率。
47 2
|
4天前
|
存储 搜索推荐 算法
【数据结构】树型结构详解 + 堆的实现(c语言)(附源码)
本文介绍了树和二叉树的基本概念及结构,重点讲解了堆这一重要的数据结构。堆是一种特殊的完全二叉树,常用于实现优先队列和高效的排序算法(如堆排序)。文章详细描述了堆的性质、存储方式及其实现方法,包括插入、删除和取堆顶数据等操作的具体实现。通过这些内容,读者可以全面了解堆的原理和应用。
43 16
|
4天前
|
C语言
【数据结构】二叉树(c语言)(附源码)
本文介绍了如何使用链式结构实现二叉树的基本功能,包括前序、中序、后序和层序遍历,统计节点个数和树的高度,查找节点,判断是否为完全二叉树,以及销毁二叉树。通过手动创建一棵二叉树,详细讲解了每个功能的实现方法和代码示例,帮助读者深入理解递归和数据结构的应用。
32 8
|
5天前
|
存储 Java 索引
Java中的数据结构:ArrayList和LinkedList的比较
【10月更文挑战第28天】在Java编程世界中,数据结构是构建复杂程序的基石。本文将深入探讨两种常用的数据结构:ArrayList和LinkedList,通过直观的比喻和实例分析,揭示它们各自的优势与局限,帮助你在面对不同的编程挑战时做出明智的选择。
|
13天前
|
存储 算法 Java
Java 中常用的数据结构
【10月更文挑战第20天】这些数据结构在 Java 编程中都有着广泛的应用,掌握它们的特点和用法对于提高编程能力和解决实际问题非常重要。
19 6
|
14天前
|
存储 Java 开发者
Java中的Map接口提供了一种优雅的方式来管理数据结构,使代码更加清晰、高效
【10月更文挑战第19天】在软件开发中,随着项目复杂度的增加,数据结构的组织和管理变得至关重要。Java中的Map接口提供了一种优雅的方式来管理数据结构,使代码更加清晰、高效。本文通过在线购物平台的案例,展示了Map在商品管理、用户管理和订单管理中的具体应用,帮助开发者告别混乱,提升代码质量。
24 1
|
11天前
|
算法 Java
JAVA 二叉树面试题
JAVA 二叉树面试题
12 0
|
2月前
|
Java
java数据结构,双向链表的实现
文章介绍了双向链表的实现,包括数据结构定义、插入和删除操作的代码实现,以及双向链表的其他操作方法,并提供了完整的Java代码实现。
java数据结构,双向链表的实现