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




相关文章
|
1天前
|
存储 算法 C++
数据结构/C++:AVL树
数据结构/C++:AVL树
6 2
|
1天前
|
JSON 数据可视化 Shell
数据结构可视化 Graphviz在Python中的使用 [树的可视化]
数据结构可视化 Graphviz在Python中的使用 [树的可视化]
8 0
|
1天前
|
存储 缓存 算法
数据结构与算法 树(B树,B+树,红黑树待完善)
数据结构与算法 树(B树,B+树,红黑树待完善)
7 0
|
1天前
【数据结构】二叉树的三种遍历(非递归讲解)
【数据结构】二叉树的三种遍历(非递归讲解)
5 1
|
1天前
|
存储
【数据结构】二叉树相关oj题(一)
【数据结构】二叉树相关oj题(一)
7 1
|
4天前
|
存储 分布式数据库
[数据结构]~二叉树
[数据结构]~二叉树
|
4天前
|
C语言
【C语言/数据结构】二叉树(层序遍历|判断完全二叉树|性质)
【C语言/数据结构】二叉树(层序遍历|判断完全二叉树|性质)
277 52
|
4天前
【数据结构】二叉树(遍历,递归)
【数据结构】二叉树(遍历,递归
14 2
|
4天前
【数据结构】二叉树-堆(top-k问题,堆排序,时间复杂度)
【数据结构】二叉树-堆(top-k问题,堆排序,时间复杂度)
15 4