开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第30天,点击查看活动详情
前言
树的概念比较多,用处很多。存在方方面面,比如linux内核中用了挺多树的算法,文件目录的实现,比如咱们常用的xml/json数据结构就是树结构的,比如前面使用的桶排序也使用了树的概念。还有咱们的社会构成关系,政府组成关系。树的概念算是计算机编程知识里的基础知识。
学习好树的知识,对于咱们扎实编程的能力更有好处。
树
啥是树呢?
定义:树是由n(n>=1)个有限结点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。
树是一种一对多的数据结构。包含n个节点,n等于0时,树称为空树。其中特定的一个节点称为根节点,根节点是唯一的。每个节点都可以看成一棵树。所有的子树构成一个树,且子树相互之间不是相交的。
子节点
当前节点拥有的子树的根节点称为该节点的子节点。
父节点
一个节点的前驱节点称为该节点的父节点。
度
节点的度:节点拥有的字节点的个数。 树的度:节点的度的最大值称为该树的度。
叶子节点
度为零的节点,称为叶子节点。
兄弟节点
同一个父节点的那些节点的关系
节点层树
从跟节点开始算起,计数从1开始计算。
堂兄弟节点
父节点在同一层次的子节点的关系。
深度
节点深度:节点的层次就是该节点的深度;
树的深度:节点的深度的最大值。
有的博文按照从0开始计算,有一些教材是从1开始计算,咱们这里从1开始计算,少记一些概念,多点脑子记其他的重要知识,还不容易混乱。
高度
节点高度:从该节点往下到某个叶子节点的最大值 树的高度:从根节点到叶子节点的最大值,值与深度相等。
分类
树构建的类型
- 无序树,又称自由树,基本不用
- 有序树:兄弟节点之间有顺序关系
- 二叉树:每个节点最多只能有两个字节点的树
-
完全二叉树:如树深度为d,则d-1层节点满字节点,d层叶子节点从左向右满排列。
-
- 平衡二叉树:任何节点的子树高度差不能超过1,下图所示可称为一个平衡二叉树。
- 满二叉树:每个层级的节点数能达到最大。
满二叉树,如层数为d层,则总共包含有个节点。
第i层节点树:
遍历
二叉树的节点遍历:前序遍历,中序遍历,后序遍历。
- 前序遍历: 根节点-》左字节点-》右字节点
- 中序遍历:左字节点-》根节点-》右字节点
- 后序遍历:右字节点-》左字节点-》根节点