树是一种非线性表

树的种类

树的种类
树,二叉树
二叉查找树
平衡二叉查找树、红黑树
递归树

树的特征:

“树”这种数据结构里面每个元素叫作“节点”;用来连线相邻节点之间的关系叫作“父子关系”。

比如下面这幅图,A 节点就是 B 节点的父节点,B 节点是 A 节点的子节点。B、C、D 这三个节点的父节点是同一个节点,所以它们之间互称为兄弟节点。没有父节点的节点叫根节点,也就是图中的节点 E。没有子节点的节点叫作叶子节点或者叶节点,比如图中的 G、H、I、J、K、L 都是叶子节点。

image.png

树的概念

高度、层、深度他们是这样定义的

  1. 节点的高度=节点到叶子节点的最长路径(边数)
  2. 节点的深度=根节点到这个节点所经历的边的个数
  3. 节点的层数=节点的深度+1
  4. 树的高度=根节点的高度

image.png

“高度”是从下往上度量,从最底层开始计数计数的起点是 0。

“深度”是从上往下度量,从根结点开始度量计数起点也是 0。

“层数”跟深度的计算类似,不过计数起点是 1。

二叉树

二叉树的每个节点最多有两个子节点,分别是左子节点和右子节点。二叉树中,有两种比较特殊的树,分别是满二叉树和完全二叉树。满二叉树又是完全二叉树的一种特殊情况。

二叉树既可以用链式存储,也可以用数组顺序存储。数组顺序存储的方式比较适合完全二叉树,其他类型的二叉树用数组存储会比较浪费存储空间。除此之外,二叉树里非常重要的操作就是前、中、后序遍历操作,遍历的时间复杂度是 O(n),需要用递归代码来实现。

二叉树是树的一种,特点是每个节点最多有两个子节点,分别是左子节点右子节点。不过,二叉树有的节点只有左子节点,有的节点只有右子节点:

image.png

上图编号 2 的二叉树中,叶子节点全都在最底层,除了叶子节点之外,每个节点都有左右两个子节点,这种二叉树就叫作满二叉树

编号 3 的二叉树中,叶子节点都在最底下两层,最后一层的叶子节点都靠左排列,并且除了最后一层,其他层的节点个数都要达到最大,这种二叉树叫作完全二叉树

完全二叉树

image.png

最后一层的叶子节点靠左排列的才叫完全二叉树,如果靠右排列就不能叫完全二叉树了。

二叉树遍历

前序遍历、中序遍历和后序遍历。

  • 前序遍历是指,对于树中的任意节点来说,先打印这个节点,然后再打印它的左子树,最后打印它的右子树。
  • 中序遍历是指,对于树中的任意节点来说,先打印它的左子树,然后再打印它本身,最后打印它的右子树。
  • 后序遍历是指,对于树中的任意节点来说,先打印它的左子树,然后再打印它的右子树,最后打印这个节点本身。

image.png

二叉查找树

二叉查找树是二叉树中最常用的一种类型,也叫二叉搜索树。二叉查找树支持动态数据集合的快速插入、删除、查找操作。

二叉查找树要求,在树中的任意一个节点,其左子树中的每个节点的值都小于这个节点的值,而右子树每个节点的值都大于这个节点的值:

image.png

二叉查找树查找操作

首先,我们看如何在二叉查找树中查找一个节点。我们先取根节点,如果它等于我们要查找的数据,那就返回。如果要查找的数据比根节点的值小,那就在左子 树中递归查找;如果要查找的数据比根节点的值大,那就在右子树中递归查找。

image.png

二叉查找树插入操作

二叉查找树的插入过程需要从根节点开始,依次比较要插入的数据和节点的大小关系。

如果要插入的数据比节点的数据大,并且节点的右子树为空,就将新数据直接插到右子节点的位置;如果不为空,就再递归遍历右子树,查找插入位置。同理,如果要插入的数据比节点数值小,并且节点的左子树为空,就将新数据插入到左子节点的位置;如果不为空,就再递归遍历左子树,查找插入位置。

image.png

二叉查找树的删除操作

针对要删除节点的子节点个数的不同需要分2种情况来处理。

如果要删除的节点只有一个子节点(只有左子节点或者右子节点)或没有子节点(左右子节点均为Null),只需要要将要删除节点的父节点的指针指向要删除节点的子节点。比如下图中删除节点 55、 13。

如果要删除的节点有两个子节点。需要找到这个节点的右子树中的最小节点,把它替换到要删除的节点上。然后再按照上面方法删除掉这个最小节点。比如下图中的删除节点 18。(用左子树的最大节点进行替换也可以)

image.png