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

463 阅读8分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第19天,点击查看活动详情


⭐️前面的话⭐️

本篇文章带大家认识数据结构——树与二叉树,树是一种非线性的数据结构,它是由有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。本文将从理论的角度介绍树与二叉树的概念特点与性质,为后续树的实践打下理论基础。

📒博客主页:未见花闻的博客主页
🎉欢迎关注🔎点赞👍收藏⭐️留言📝
📌本文由未见花闻原创!
📆掘金首发时间:🌴2022年4月20日🌴
✉️坚持和努力一定能换来诗与远方!
💭参考书籍:📚《java编程思想》,📚《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 分支结点与叶结点:不为零的结点称为非终端结点,又叫分支结点度为零的结点称为终端结点或叶结点(或叶子结点)。 度为11的结点称为单分支结点;度为22的结点称为双分支结点,依此类推。 1-1-2 孩子结点、双亲结点和兄弟结点: 在一棵树中,每个结点的后继,被称作该结点的孩子结点(或子女结点)。相应地,该结点被称作孩子结点的双亲结点(或父母结点)。 具有同一双亲孩子结点互为兄弟结点1-1-3 结点的层次和树的高度: 树中的每个结点都处在一个层次上。结点的层次从树根开始定义,根结点为第11层,它的孩子结点为第22层,以此类推,一个结点所在的层次为其双亲结点所在的层次加11。 树中结点的最大层次称为树的高度(或树的最深深度)。 1-1-4 路径与路径长度: 两个结点di和dj的结点序列称为路径。路径长度等于路径所通过的结点数目减11(即路径上分支数目)。 1-1-5

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

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

1.2树的表示

1.2.1树的逻辑表示

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

1.2.2树的储存表示法

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

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

1.3树的性质

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

性质2 设树的度为mmnn为总结点个数,nin_i为度为i0imi(0≤i≤m)的结点个数,则: n=n0+n1++nmn=n_0+n_1+…+n_m

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

性质4 度为mm的树中第ii层上至多有mi1m^{i-1}个结点i1(i≥1)

性质5 高度为hhmm次树至多有mh1m1\frac{m^h-1}{m-1} 个结点。

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

例题: 1-7

2.二叉树

2.1二叉树的概念

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

// 孩子表示法
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。即:n0=n2+1n_0=n_2+1

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

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

性质4 具有nn个结点的完全二叉树的深度kklog2(n+1)log_2(n+1)上取整。

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

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

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

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