大家好!我是【AI 菌】,一枚
不熬夜
的程序员。我热爱AI、热爱分享、热爱开源
! 这博客是我对学习的一点总结与思考。如果您也对深度学习、机器视觉、算法、Python、C++
感兴趣,可以关注我的动态,我们一起学习,一起进步~
说起树,大家都不陌生,毕竟是日常生活中常见的事物。但是今天的主角不是树木,我们来聊聊数据结构中的树、二叉树和二叉查找树,以及它们的基本操作!
树是一种数据结构,它是由n(n>=1)个有限结点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。
树是由结点和边组成的,不存在环的一种数据结构。通过下图,我们就可以更直观的认识树的结构。
树满足递归定义的特性。也就是说,如果一个数据结构是树结构,那么剔除掉根结点后,得到的若干个子结构也是树,通常称作子树。
在一棵树中,根据结点之间层次关系的不同,对结点的称呼也有所不同。我们来看下面这棵树,如下图所示:
不同结点的关系与称呼如下:
当有了一棵树之后,还需要用深度、层来描述这棵树中结点的位置。如上图所示,结点的层次从根结点算起:
树中结点的最大层次数,就是这棵树的树深(称为深度,也称为高度)因此这是一棵深度为 4 的树。
在树的大家族中,有一种被高频使用的特殊树,它就是二叉树。在二叉树中,每个结点最多有两个分支,即每个结点最多有两个子结点,分别称作左子结点和右子结点。
在二叉树中,有两个最为特殊的类型,如下图所示:
你可能会困惑,完全二叉树看上去并不完全,但为什么这样称呼它呢?这其实和二叉树的存储有关系。存储二叉树有两种办法,一种是基于指针的链式存储法,另一种是基于数组的顺序存储法。
之所以称为完全二叉树,是从存储空间利用效率的视角来看的。对于一棵完全二叉树而言,仅仅浪费了下标为 0 的存储位置。而如果是一棵非完全二叉树,则会浪费大量的存储空间。
如下图所示的非完全二叉树,它既需要保留出 5 和 6 的位置。同时,还需要保留 5 的两个子结点 10 和 11 的位置,以及 6 的两个子结点 12 和 13 的位置。这样的二叉树,没有完全利用好数组的存储空间。
接下来,我们以二叉树为例介绍树的操作,其他类型的树的操作与二叉树基本相似。
可以发现,我们以前学到的数据结构都是“一对一”的关系,即前面的数据只跟下面的一个数据产生了连接关系,例如链表、栈、队列等。而树结构则是“一对多”的关系,即前面的父结点,跟下面若干个子结点产生了连接关系。
在“一对一”的结构中,查找具有某个数值,可以直接按顺序遍历每一条数据。可是,树是“一对多”的关系,那该按什么顺序遍历呢?
其实,遍历一棵树,有非常经典的三种方法,分别是前序遍历、中序遍历、后序遍历。这里的序指的是父结点的遍历顺序,前序就是先遍历父结点,中序就是中间遍历父结点,后序就是最后遍历父结点。
不管哪种遍历,都是通过递归调用完成的。如下图所示:
对于没有任何特殊性质的二叉树而言,抛开遍历的时间复杂度以外,真正执行增加和删除操作的时间复杂度是 O(1)。树数据的查找操作和链表一样,都需要遍历每一个数据去判断,所以时间复杂度是 O(n)。
但当二叉树具备一些特性的时候(比如二叉查找树),则可以利用这些特性实现时间复杂度的降低。
二叉查找树(也称作二叉搜索树)具备以下几个的特性:
所以二叉查找树可以简单的认为是,是一个按规则排好序的二叉树。
在利用二叉查找树执行查找操作时,我们可以进行以下判断:
这样的“二分查找”所消耗的时间复杂度就可以降低为 O(logn)。关于二分查找,后面会在算法部分文章讲到。
在二叉查找树执行插入操作也很简单。从根结点开始,如果要插入的数据比根结点的数据大,且根结点的右子结点不为空,则在根结点的右子树中继续尝试执行插入操作。直到找到为空的子结点执行插入动作。
如下图所示,如果要插入数据 X 的值为 14,则需要判断 X 与根结点的大小关系:
因为此时左子树为空,则直接通过指针建立 15 结点的左指针指向结点 X 的关系,就完成了插入动作。
二叉查找树插入数据的时间复杂度是 O(logn)。但这并不意味着它比普通二叉树要复杂。原因在于这里的时间复杂度更多是消耗在了遍历数据去找到查找位置上,真正执行插入动作的时间复杂度仍然是 O(1)。
二叉查找树的删除操作会比较复杂,这是因为删除完某个结点后的树,仍然要满足二叉查找树的性质。我们分为下面三种情况讨论。
(1)如果要删除的结点是某个叶子结点,则直接删除,将其父结点指针指向 null 即可。
(2)如果要删除的结点只有一个子结点,只需要将其父结点指向的子结点的指针换成其子结点的指针即可。
(3)如果要删除的结点有两个子结点,则有两种可行的操作方式。
本文为我学习《重学数据结构与算法 》的学习笔记,仅用于学习交流,特此分享,请勿商业转载!文中图片参考:https://kaiwu.lagou.com/course/courseInfo.htm?courseId=185#/detail/pc?id=3347