【JavaSE与数据结构】数据结构与算法之树与二叉树(理论篇)

⭐️前面的话⭐️

本篇文章带大家认识数据结构——树与二叉树,树是一种非线性的数据结构,它是由有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。本文将从理论的角度介绍树与二叉树的概念特点与性质,为后续树的实践打下理论基础。
Tips:数据结构——链表,在博主的历史文章中介绍过并通过Java和C语言都实现模拟过,所以对链表不再多赘述,集合框架中LinkedList类底层就是使用双链表实现的,因此在Java中可以使用LinkedList对象来使用链表,如果对链表不了解,可以去博主数据结构与算法专栏了解。

📒博客主页:未见花闻的博客主页
🎉欢迎关注🔎点赞👍收藏⭐️留言📝
📌本文由未见花闻原创,CSDN首发!
📆首发时间:🌴2022年1月24日🌴
✉️坚持和努力一定能换来诗与远方!
💭参考书籍:📚《Java核心技术》,📚《Java编程思想》,📚《Effective Java》
💬参考在线编程网站:🌐牛客网🌐力扣
博主的码云gitee,平常博主写的程序代码都在里面。
博主的github,平常博主写的程序代码都在里面。
🙏作者水平很有限,如果发现错误,一定要及时告知作者哦!感谢感谢!



题外话: 本篇文章为数据结构之二叉树的理论部分,是后续二叉树实践,堆,优先队列,堆排序,红黑树等数据结构和算法的基础。
封面


1.树

1.1树的概念

树是一种非线性的数据结构,它是由 n(n>=0) 个有限结点组成一个具有层次关系的集合。当n为0时,该树表示一棵空树。

当树不为空树时,即n>0时,树有以下特点:

  • 有且仅有一个结点root,它没有前驱结点,结点root称作树的根结点。
  • 除根结点外,每个结点有且仅有一个前驱结点。
  • 树中每个结点可以有零个或多个后继结点。

从递归的角度出发,一棵树(空树除外)是由m棵子树构成的(m >= 0),树形结构中,子树之间不能有交集,否则就不是树形结构。

国->省->市->县…就是一种树形结构,除此之外还有我们电脑里面的文件夹也是这种结构。
1-1
关于树的一些术语:

结点的度与树的度: 树中一个结点的子树的个数称为该结点的度。树中各结点的度的最大值称为树的度,通常将度为m的树称为m次树或者m叉树。
1-1-1
分支结点与叶结点:不为零的结点称为非终端结点,又叫分支结点度为零的结点称为终端结点或叶结点(或叶子结点)。
度为 1 1 1的结点称为单分支结点;度为 2 2 2的结点称为双分支结点,依此类推。
1-1-2
孩子结点、双亲结点和兄弟结点: 在一棵树中,每个结点的后继,被称作该结点的孩子结点(或子女结点)。相应地,该结点被称作孩子结点的双亲结点(或父母结点)。
具有同一双亲孩子结点互为兄弟结点
1-1-3
结点的层次和树的高度: 树中的每个结点都处在一个层次上。结点的层次从树根开始定义,根结点为第 1 1 1层,它的孩子结点为第 2 2 2层,以此类推,一个结点所在的层次为其双亲结点所在的层次加 1 1 1
树中结点的最大层次称为树的高度(或树的最深深度)。
1-1-4
路径与路径长度: 两个结点di和dj的结点序列称为路径。路径长度等于路径所通过的结点数目减 1 1 1(即路径上分支数目)。
1-1-5

子孙结点和祖先结点: 在一棵树中,一个结点的所有子树中的结点称为该结点的子孙结点。
从根结点到达一个结点的路径上经过的所有结点被称作该结点的祖先结点。
1-1-6
有序树和无序树: 若树中各结点的子树是按照一定的次序从左向右安排的,且相对次序是不能随意变换的,则称为有序树,否则称为无序树,不指明是否是有序树,则一般默认是有序树。

森林: n ( n > 0 ) n(n>0) nn>0个互不相交的树的集合称为森林。
把含有多棵子树的树的根结点删去就成了森林。反之, 给 m ( m > 1 ) m(m>1) mm>1棵独立的树加上一个结点,并把这 m m m棵树作为该结点的子树,则森林就变成了一颗树。
1-1-7

1.2树的表示

1.2.1树的逻辑表示

(1)树形表示法。使用一棵倒置的树表示树结构,非常直观和形象。
1-2
(2)文氏图表示法。使用集合以及集合的包含关系描述树结构。
1-3
(3)凹入表示法。使用线段的伸缩关系描述树结构。
1-4
(4)括号表示法。用一个字符串表示树。
基 本 形 式 : 根 ( 子 树 1 , 子 树 2 , … , 子 树 m ) 基本形式:根(子树1,子树2,…,子树m) (12m)
1-5

1.2.2树的储存表示法

树结构相对线性表就比较复杂了,要存储表示起来就比较麻烦了,实际中树有很多种表示方式,如:双亲表示法,孩子表示法、孩子双亲表示法、孩子兄弟表示法等等。我们这里就简单的了解其中最常用的孩子表示法(二叉树用的最多),孩子兄弟(非二叉树用的较多)表示法。

所谓孩子表示法就是一个结点中有一个数据域和一些指针域(数目不确定,二叉树是两个,三叉树是三个,以此类推),这些指针都指向孩子结点。
孩子兄弟表示法就是一个结点中有一个数据域和两个指针域,一个指针指向左边的孩子结点,另一个指针指向右边的兄弟结点。
1-6

1.3树的性质

性质1 树中的结点数等于所有结点的度数之和加1
树中每个分支计为一个结点的度(每条分支线从一个结点引出来的),除了根结点,每条分支线都指向一个结点。
所 有 结 点 的 度 之 和 = 分 支 数 = 结 点 数 − 1 所有结点的度之和=分支数=结点数-1 =1

性质2 设树的度为 m m m n n n为总结点个数, n i n_i ni为度为 i ( 0 ≤ i ≤ m ) i(0≤i≤m) i0im的结点个数,则:
n = n 0 + n 1 + … + n m n=n_0+n_1+…+n_m n=n0+n1++nm

性质3 设树的总结点数为 n n n,树的度为 m m m n i n_i ni为度为 i ( 0 ≤ i ≤ m ) i(0≤i≤m) i0im的结点个数,则有:
所 有 结 点 度 之 和 = n 1 + 2 n 2 + … + m n m = n − 1 所有结点度之和 = n_1+2n_2+…+mn_m = n-1 =n1+2n2++mnm=n1

性质4 度为 m m m的树中第 i i i层上至多有 m i − 1 m^{i-1} mi1个结点 ( i ≥ 1 ) (i≥1) i1
性质5 高度为 h h h m m m次树至多有 m h − 1 m − 1 \frac{m^h-1}{m-1} m1mh1 个结点。

性质6 具有 n n n个结点的 m m m次树的最小高度为 l o g m ( n ( m − 1 ) + 1 ) log_m(n(m-1)+1) logm(n(m1)+1)

例题:
1-7

2.二叉树

2.1二叉树的概念

一棵树上所有结点的度均不大于 2 2 2,则这棵树是一棵二叉树,空树是一棵特殊的二叉树。
一棵树是二叉树,其子树均为二叉树,二叉树的储存表示方法常用孩子表示法和孩子双亲表示法进行储存。

// 孩子表示法
class Node { 
	int val; // 数据域 
	Node left; // 左孩子的引用,常常代表左孩子为根的整棵左子树 
	Node right; // 右孩子的引用,常常代表右孩子为根的整棵右子树 
}
// 孩子双亲表示法
class Node { 
	int val; // 数据域 
	Node left; // 左孩子的引用,常常代表左孩子为根的整棵左子树 
	Node right; // 右孩子的引用,常常代表右孩子为根的整棵右子树 
	Node parent; // 当前节点的根节点 
}

二叉树都是由一下几种情况复合而成:
2-1
2-2
二叉树和2次树有什么区别?

2次树是度为2的树,至少有3个结点;二叉树的结点个数可以为0。
2次树中度为1的结点的孩子不分左、右孩子;而二叉树中度为1的结点的孩子需要区分左、右孩子。

2.2特殊的二叉树

满二叉树与完全二叉树是二叉树的两种特殊情况。
满二叉树: 在一棵二叉树中,除叶子结点外,其他所有结点的度均为2,则该树为满二叉树。
2-3

完全二叉树: 从根结点开始,每个非空结点按照层次依次递增,每层从左至右的顺序排列的二叉树,称为完全二叉树。换个说法,完全二叉树实际上是对应的满二叉树删除叶结点层最右边若干个结点得到的。

2-4

2.3二叉树的性质

性质1 非空二叉树上叶结点数等于双分支结点数加1。即: n 0 = n 2 + 1 n_0=n_2+1 n0=n2+1

性质2 非空二叉树上第 i i i层上至多有 2 i − 1 2^{i-1} 2i1个结点 ( i ≥ 1 ) (i≥1) i1

性质3 若规定只有根结点的二叉树的深度为 1 1 1,高度为 h h h的二叉树至多有 2 h − 1 2^{h}-1 2h1个结点 ( h ≥ 1 ) (h≥1) h1

性质4 具有 n n n个结点的完全二叉树的深度 k k k l o g 2 ( n + 1 ) log_2(n+1) log2(n+1)上取整。

性质5 完全二叉树性质(含 n n n个结点,树的度为 m m m):
对于具有 n n n个结点的完全二叉树,默认按照从上至下从左至右的顺序对所有节点从 1 1 1开始编号,序号为 j j j,设 n i n_i ni为度为 i ( 0 ≤ i ≤ m ) i(0≤i≤m) i0im的结点个数, [   ] [\ ] [ ]为取整符号,完全二叉树性质:

  • n n n为奇数则 n 1 = 0 n_1=0 n1=0 n n n为偶数则 n 1 = 1 n_1=1 n1=1
  • j ≤ [ n / 2 ] j≤[n/2] j[n/2],则编号为 j j j的结点为分支结点,否则为叶结点。
  • 除树根结点外,若一个结点的编号为 j j j,则它的双亲结点的编号为 [ j / 2 ] [j/2] [j/2],如果是从 0 0 0开始编号,则它的双亲结点的编号为 [ ( j − 1 ) / 2 ] [(j-1)/2] [(j1)/2]
  • 若编号为 j j j的结点有左孩子结点,则左孩子结点的编号为 2 j 2j 2j;若编号为 j j j的结点有右孩子结点,则右孩子结点的编号为 2 j + 1 2j+1 2j+1。如果是从 0 0 0开始编号,若编号为 j j j的结点有左孩子结点,则左孩子结点的编号为 2 j + 1 2j+1 2j+1;若编号为 j j j的结点有右孩子结点,则右孩子结点的编号为 2 j + 2 2j+2 2j+2
  • 完全二叉树最大高度为 h = [ l o g 2 ( n + 1 ) ] 向 上 取 整 或 者 [ l o g 2 n ] + 1 。 h=[log_2(n+1)]向上取整或者[log_2n]+1。 h=[log2(n+1)][log2n]+1(性质4

2-5
小试牛刀:
2-6
参考答案:
2-7

好了,本文就分享到这里了,下次再见!


觉得文章写得不错的老铁们,点赞评论关注走一波!谢谢啦!

1-99

  • 45
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 22
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

未见花闻

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值