博主秋招提前批已拿百度、字节跳动、拼多多、顺丰等公司的offer,可加微信:pcwl_Java 一起交流秋招面试经验,可获得博主的秋招简历和复习笔记。
树是一种非线性数据结构,这种数据结构要比线性数据结构复杂的多,因此分为三篇博客进行讲解:
第一篇:树的基本概念及常用操作的Java实现(二叉树为例)
第二篇:二叉查找树
第三篇:红黑树
本文目录:
第一篇:树的基本概念及常用操作
1、基本概念
1.1 什么是树
我们前面学习的数组、链表等都是线性结构,它们的特点是:一个节点至多只有一个头结点,至多只有一个尾结点,彼此连接起来形成一条线性的结构,如下图所示。
而树结构,是非线性的典型例子,不再是一对一,变成了一对多(图可以是多对多),如下图所示:
根据上面树的图片,我们可以大致总结下树的特点:
1、图中的树就像我们实际生活中的树倒立过来一样,最顶部的节点就是树根,即根节点(root节点);
2、每棵树至多只有一个根节点,如果树不为空,也至少有一个根节点;
3、根节点下面可以有多个子节点,但是每个子节点只能有一个父节点,同时每个子节点下面又可以有多个它的子节点;
4、具有同一个节点的节点称为兄弟节点;
5、没有子节点的节点成为叶子节点(leaf);
1.2 树的相关术语
关于树,有几个比较重要的术语需要掌握:高度(Height)、深度(Depth)、层(Level)。它们的定义如下:
1、节点的高度 = 节点到叶子节点的最长路径(边数);
2、节点的深度 = 根节点到这个节点所经历的边的个数;
3、节点的层数 = 节点的深度 + 1;
4、树的高度 = 根节点的高度。
这几个概念比较容易混淆,可以利用下面这张图片帮助记忆。
可以从生活中这个词的含义进行理解:
“高度”:这个概念就是从下往上的度量,比如我们说一栋80层楼的高度,都是从地面开始的。只不过树的高度是把0作为起点而已;
“深度”:生活中我们往往说水深多少米,很明显是从上往下度量的,所以树也是从根节点开始度量的,并且计数起点也是0.可以看出来高度和深度正好是相反的两个方向开始对树进行度量的;
“层数”:和深度的计算比较类似,只不过计数起点从1开始,即根节点位于第一层。
除此之外树还有很多其他概念,比如:
节点的度:一个节点直接含有的子树个数(即有几个分支),叫做节点的度。
树的度:即一棵树中最大节点的度,哪个节点上的子节点最多,它的度就是树的度。