二叉树是指每个节点最多有两个分支(分支的度小于2)的树结构,可为空树
分类:
1、完全二叉树
在一棵二叉树中,除了最后一层,都是满的,并且最后一层可能是满的,也可能是是右边缺少连续若干节点,成为完全二叉树。如图所示
2、满二叉树
一棵深度为k,并且有 个节点的二叉树,成为满二叉树。如图所示:
二者关系:
① 满二叉树是完全二叉树,完全二叉树不一定是满二叉树;
② 在满二叉树的最下层上,从最右边开始连续删去若干结点后得到的二叉树仍然是一棵完全二叉树。
3、二叉查找树(Binary Search Tree)
又称为二叉搜索树,排序二叉树,可为空树。满足:
i.左子树上所有结点的值均小于或等于它的根结点的值。
ii.右子树上所有结点的值均大于或等于它的根结点的值。
iii.左、右子树也分别为二叉排序树。
4、平衡二叉树(Balanced Binary Tree)
是一种结构平衡的二叉搜索树,即叶子节点深度差不超过1,能够在O(logn)内完成插入、查找和删除操作,结构如图所示,常见的平衡二叉树有AVL树、红黑树等。
问:一个具有1024个结点的完全二叉树,深度为?
h层完全二叉树的节点数n,满足公式h=,其中
要取整数。
因此深度为11
二叉树的遍历分为:
- 前序遍历(先根,再左,最后右)
- 中序遍历(先左,再根,最后右)
- 后序遍历(先左,再右,最后根)
- 层次遍历(从上到下,从左到右依次访问二叉树的每个结点)
问:广度优先遍历类似于二叉树的?层次遍历
深度优先遍历就有点像二叉树中的前序、中序和后序遍历
堆(heap)是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵树的数组对象。
其性质:
1.堆中某个节点的值总是不大于或不小于其父节点的值。
2.堆总是一棵完全二叉树。
3.若序列{k1,k2,…,kn}是堆,则堆顶元素(或完全二叉树的根)必为序列中n个元素的最小值(或最大值)。
4.非终端结点的值均不大于(或不小于)其左、右孩子结点的值。主要分类:
将根节点最大的堆叫做最大堆或大顶堆,根节点最小的堆叫做最小堆或小顶堆。
问:下列序列中哪个选项不是堆?
正确答案: C
A12 36 53 68 48 60 75
B12 48 36 60 75 68 53
C75 53 68 36 60 48 12 36和60一个比53小一个比53大
D75 68 53 60 36 12 48
线性表:关系是一对一的,有且仅有一个直接前驱和后继,位序从1开始
问:对于线性表(2,34,55,25,64,46,20,10)进行散列存储时,若选用H(K)=K %9作为散列函数,则散列地址为2的元素有几个?
2个 取模运算即可,余数为2的有2和20
栈:是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。
栈的特性:先存储,再操作,由于存在预先分配存储空间的问题,因此为了合理使用栈空间,一个栈当多个栈使用
栈的结构:连续的存储空间 ---指针分配空间
Top 存放栈顶元素
Top = -1 空栈
Top =stack_size-1 满栈
栈是预先分配大小的,所以在满栈时再入栈会出现上溢,在空栈时在出栈会出现下溢
因此:
满栈进栈是先移动指针再存;
满栈出栈是先出数据再移动指针;
空栈进栈先存再移动指针;
空栈出栈先移动指针再取数据。
分类:
静态栈:用数组实现的栈,由于数组是固定大小的,所以叫做静态栈
动态栈:用链表实现的栈,由于链表可以随时新增节点的,所以叫做动态栈
应用:
1.函数调用:一个函数内部调用另外一个函数。例A函数内部调用了B函数,B函数内部又调用了C函数,则A函数地址会先进栈,其次是B,最后是C,所以C函数在栈顶。首先找到C函数地址给CPU寄存器并执行C函数,执行完后释放内存,出栈。再找到B函数地址……,最后执行A函数,执行完后出栈。
2.中断
3.表达式求值:利用两个栈,一个栈存放数据,另外一个栈存放运算符
4.内存分配
5.缓冲处理
6.迷宫
7.括号配对问题
8.浏览器的后退
9.编辑器的撤销操作
凡是先进后出的业务逻辑执行流程都可以使用到这种数据结构
在通过Python代码进行栈的基本应用时,可以把栈的基本形态看成列表,只不过需要对这种列表的数据操作进行限制,比如只能在表的一端进行数据的插入和删除等
栈容量问题:
问:栈和队列,ABCDEF分别入栈,且出栈后及入队列。出队的顺序是BDCFEA,问栈的容量至少为?
考虑问题时抓住栈:先入后出,队列:先入先出;至少为3,解决参考链接
问:已知abc入栈,则不可能的出栈顺序为?
A:abc B:cba C:cab D:acb
A:刚入就出
B:全部入了然后再出
C错
D:a即入即出,bc按顺序入栈出栈