数据结构:八大类型数据结构
什么是数据结构:数据结构是指相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素之间的关系组成 。
常用的数据结构有:数组,栈,链表,队列,树,图,堆,散列表等,如图所示:
树:
树是一种数据结构,它是由n(n>=1)个有限节点组成一个具有层次关系的集合。把它叫做 “树” 是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:
- 每个节点有零个或多个子节点;
- 没有父节点的节点称为根节点;
- 每一个非根节点有且只有一个父节点;
- 除了根节点外,每个子节点可以分为多个不相交的子树;
5.
然后你要知道一大堆关于树的术语:度,叶子节点,根节点,父节点,子节点,深度,高度。
结点:树的结点由数据元素及其若干分支组成
树和子树(subtree):以根结点为根的树为全树(或树),以其他结点作为根结点的树为子树
结点的度:结点的度指的是结点分支的个数
树的度:选取所有结点中最大的度就是树的度
叶子结点(leaf node):度为0的结点就是叶子结点,它位于树最深层,并且树只要非空,就一定存在叶子结点。
分支结点(internal node):度大于0的结点为分支结点,显然除了叶子结点之外的结点都为分支结点。而且根结点也是分支结点
父节点(father node)和子结点(child node):
一个结点若干分支下的结点都为该结点的子结点(或称孩子(children)),并且,该结点称为子结点的父节点
层次(level)
树是一个递归结构,所以也有层次这种概念,由层次也会引发出树的深度,就好像递归也有深度一样。结点的层次为从结点到根结点的路径中边的条数,并且认为根结点的层次为0,因为根结点到自身的路径中边的条数为0,结点的层次有时也称为结点的深度(depth)
树的深度:
与树的度对应于结点的度一样,树的深度也是选取结点中的最大深度(或最大层次
在日常的应用中,我们讨论和用的更多的是树的其中一种特殊结构,就是二叉树。
什么是二叉树:
二叉树是树的特殊一种,具有如下特点:
1、每个结点最多有两颗子树,结点的度最大为2。
2、左子树和右子树是有顺序的,次序不能颠倒。
3、即使某结点只有一个子树,也要区分左右子树。
二叉树是一种比较有用的折中方案,它添加,删除元素都很快,并且在查找方面也有很多的算法优化,所以,二叉树既有链表的好处,也有数组的好处,是两者的优化方案,在处理大批量的动态数据方面非常有用。
二叉树有很多扩展的数据结构,包括平衡二叉树、红黑树、B+树等,这些数据结构二叉树的基础上衍生了很多的功能,在实际应用中广泛用到,例如mysql的数据库索引结构用的就是B+树,还有HashMap的底层源码中用到了红黑树。
二叉树的五种基本形态:
二叉树的遍历方式:
https://leetcode-cn.com/leetbook/read/data-structure-binary-tree/xe17x7/
笔试题:已知二叉树前序遍历为:ABDEGHCF,中序遍历为:DBGEHACF,求后序遍历
分析:
- 首先我们由前序遍历可知根节点为A
- 已知根节点为A,由中序遍历可知左子树为DBGEH,右子树为CF
确定这两点后就很容易推算出原来的二叉树的样子了。
我们看到右子树节点为CF,中序遍历也是CF,那么就可以推断出现在的二叉树右边是这个样子:
为什么F不是左子树呢,因为如果F在左边,中序遍历的顺序就变成FC了
由前序遍历AB可以知,A的左子树肯定是B,那么现在的树就是这样的:
再由中序遍历DB可知,D为B的左子树
现在只剩下EGH没确定了
首先我们要确定的是D肯定没有子树,如果有,中序遍历就不会是DB了
由前序遍历可知E节点只能是B的右子树了
最后由中序遍历GEH可知完整的二叉树为:
这题答案 后序遍历就出来了:DGHEBFCA