程序的好坏一般来说有2个标准,一个是时间复杂度,一个是空间复杂度。时间复杂度说的是程序运行的时间;空间复杂度说的是程序的内存占用的多少。
而数据结构就是为了解决时间复杂度的,或者说一个好的数据结构(算法)可以节省程序运行的时间。
线性结构
顾名思义,线性表是一条线的。首先要稍稍提一下,数据结构的存储只有数组(Array)和链表(Linklist)2种方式来实现。任何的数据结构都会涉及到创建,插入,删除这几个操作
所以线性表同样的,可以由数组和链表来实现。其中线性表又分为2种形式一种叫堆栈(Stack),一种叫队列(Queue)。
堆栈
堆栈的特点是先进后出,后进先出。它的实现就是普通的数组和单向链表。
队列
队列的特点是先进先出,后进后出。就像排队一样。实现方法也是普通的数组和单向链表。只是思路变换了,不是什么大难题。
接下来才是我想特别写的树(tree)
树
树的开始,我们来先说说二分查找https://baike.baidu.com/item/二分查找/10628618?fr=aladdin(我相信百度会比我说的好的)
二分查找的前提条件是这一堆数据必须是顺序存储,升序降序都可以,但是必须要顺序。然后每次都拿中间项与查找项比较。
二分查找的优势在于,它100%能排除到一半的数据,所以相比于堆栈和队列的查找方式会快很多。 那么通过二分查找来引出我们的
树,
通过二分查找你有没有发现,不管查找了多少次,查找的方向是左还是右,都是按照一定的规律进行的。我们来画一个图就看看
我们查找2和5就一定会在第2次找到,我们要找1,4,6就一定会在第3次找到。也就是说在二分查找中,某个数据被查找的次数是固定的。而这样一个图是不是很像一个树呢?其实这就是树。
树的概念
每一个元素都称为结点(node)(后面改了,下面的节点全部当成结点对待O(∩_∩)O)
树和子树
根:根是一个相对概念,比如对2节点和5节点来说他们的根就是3节点。1节点的根就是2节点。4节点和6节点的根是5节点。
边:就是上面的蓝色箭头。一个拥有N个节点的树有N-1条边。
结点的层次:根结点的层次为1,其余结点的层次为父结点层次+1 。
子树:子树同样也是一棵树,所以他们也拥有自己的根。每个子树是互不相交的,如果子树之间相交则不能称之为树。除了根节点以外,每个节点只有一个父节点。
节点的度:一个节点的子树个数。
树的度:一棵树中最大的节点的度作为树的度。例如上面,3节点的度是2。2节点的度是1。5节点的度是2 。所以这棵树的度是2
叶节点:度为0的节点。用人话来说就是层次最低的节点。->1,4,6这几个就是叶节点。
父子节点:这是一个相对概念,需要注意的是父子关系只存在于相邻的上下层次间。比如3是5的父节点,而不是4or6的父节点。
兄弟节点:在同一层次的节点称为兄弟节点。
路径和路径的长度:就是某一个节点沿着层层父节点往上走的轨迹。经过的箭头就是该路径的长度。
祖先节点:与父子节点类似,沿着一条向上的路径,该路径上所以的节点都是出发点的祖先节点。
子孙节点:沿着一条向下的路径,该路径所以的节点都是出发点的子孙节点。
树的深度:树的所有结点中最大的层次。
二叉树:
简单来说,一个node里含有数据域和指针域(含有1个FirstChild指针和1个NextSibling指针)
二叉树的种类
无序树,有序树,完全二叉树,满二叉树。
完全二叉树:
除了叶结点外,其余结点的指针域都不是NULL;
满二叉树:
是从完全二叉树衍生的一种树,满二叉树只能缺少叶结点。