简单数据结构 之 队列、栈、树、堆

线性结构:数组、链表、队列、栈 
树形结构:二叉树及其变型,线段树,堆...
图形结构:各种图

栈和队列

  • 栈Stack

先进后出(FILO)
栈

  • 队列Queue

先进先出(FIFO)
队列


树和堆

【二叉树】:二叉树是一棵特殊的树,二叉树每个节点最多有两个孩子结点,分别称为左孩子和右孩子。
1) 二叉树的第i 层上至多有2^(i-1) 个结点。
2) 深度为k 的二叉树至多有2^k-1 个结点。

【满二叉树】:高度为N的满二叉树有2^N- 1个节点的二叉树。

【完全二叉树】: 若设二叉树的深度为h,除第h 层外,其它各层(1~h-1) 的结点数都达到最大个数,第h 层所有的结点都连续集中在最左边,这就是完全二叉树

【满二叉树是完全二叉树的特例】
n 个结点的完全二叉树深度为。log2(n+1)

二叉树

二叉树及其三种遍历

二叉树

前序遍历顺序为:ABDGHCEIF(规则是先是根结点,再前序遍历左子树,再前序遍历右子树)

中序遍历顺序为:GDHBAEICF(规则是先中序遍历左子树,再是根结点,再是中序遍历右子树)

后序遍历顺序为:GHDBIEFCA(规则是先后序遍历左子树,再是后序遍历右子树,再是根结点)

二叉树的度

通俗的讲二叉树中连接节点和节点的线就是度,有n个节点,就有n-1个度,节点数总是比度要多一个,那么度为0的节点一定是叶子节点,因为该节点的下面不再有线;度为1的节点即:该节点只有一个分支;同理度为2的节点就是有两个分支。在二叉树中不可能存在度为3或大于3的节点!

度和节点之间的关系

k:总度数
k+1:总节点数
n0:度为0的节点
n1:度为1的节点
n2:度为二的节点
根据二叉树中度和节点的守衡原理,可列出以下一组方程:
k=n2*2+n1;
k+1=n2+n1+n0;
将上面两式相减得到:n0=n2+1;

二叉树可以是空树,所以可以没有节点的度为2


堆(Heap)

最大堆:每个节点的值都大于等于它的孩子节点。
最小堆:每个节点的值都小于等于它的孩子节点。

  • 堆的存储

可以理解为二叉树的一种,是节点间有序关系的完全二叉树,所以可以用数组来表示。
对于下标为i的节点,它的子树的左节点的下标为2i,右节点为2i+1,父亲的节点下标为i/2(向下取整)。

  • 前缀、中缀、后缀表达式转换与求值

前缀表达式:运算符位于操作数之前。
中缀表达式:操作符处于操作数的中间。中缀表达式是人们常用的算术表示方法。(但是计算机计算中缀表达式是复杂的,所以一般需要将中缀表达式转换成前缀或者后缀表达式)
后缀表达式:运算符位于操作数之后。
举例:
(3+4)×5-6 中缀表达式
-×+3456 前缀表达式
34+5×6- 后缀表达式

前缀表达式的计算机求值:

从右至左扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(栈顶元素 op 次顶元素),并将结果入栈;重复上述过程直到表达式最左端,最后运算得出的值即为表达式的结果。
例如前缀表达式“- × + 3 4 5 6”:

  1. 从右至左扫描,将6、5、4、3压入堆栈;
  2. 遇到+运算符,因此弹出3和4(3为栈顶元素,4为次顶元素,注意与后缀表达式做比较),计算出3+4的值,得7,再将7入栈;
  3. 接下来是×运算符,因此弹出7和5,计算出7×5=35,将35入栈;
  4. 最后是-运算符,计算出35-6的值,即29,由此得出最终结果。

后缀表达式的计算机求值:

与前缀表达式类似,只是顺序是从左至右:
从左至右扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(次顶元素 op 栈顶元素),并将结果入栈;重复上述过程直到表达式最右端,最后运算得出的值即为表达式的结果。
例如后缀表达式“3 4 + 5 × 6 -”:

  1. 从左至右扫描,将3和4压入堆栈;
  2. 遇到+运算符,因此弹出4和3(4为栈顶元素,3为次顶元素,注意与前缀表达式做比较),计算出3+4的值,得7,再将7入栈;
  3. 将5入栈;
  4. 接下来是×运算符,因此弹出5和7,计算出7×5=35,将35入栈;
  5. 将6入栈;
  6. 最后是-运算符,计算出35-6的值,即29,由此得出最终结果。

猜你喜欢

转载自blog.csdn.net/qq_41401130/article/details/81843010