[原创] 程序员面试宝典:第十三章 数据结构基础
1. 单链表逆置:头插法,三个指针控制下,一个一个地指向前边元素
2. 二叉查找树:左孩子小,右孩子大的二叉树
- 建树:按大小关系放置
- 查询:按大小关系走
- 排序:先左后右,中序输出
- 找最大最小:左到底或者右到底
- 找直接后继:
- 有右子树:右子树中最小元素
- 无右子树:向上找到第一个是左孩子的节点,其父节点即是后继。(比当前节点大一点点的)
- 插入:按大小关系放置
- 删除:
- 无孩子节点,直接删
- 1个孩子节点,删除之后把孩子连接到父节点
- 2个孩子节点,将其直接后继移动到这个位置(将只比被删除节点大一点儿的节点放在删除位置)
3. 约瑟夫环:n个人,从k开始报数,数到m的出列,求出列序列。
4. 栈:
- 函数压参:从右向左
- 生长方向:windows,从上向下
5. 栈和队列:
- 用两个栈实现队列:A入,B出,当B空时,一次性将A弹空,压入B
- 用两个队列实现栈:入到空的队列里边,出时,将n-1个元素装入另一个空的里边,将最后一个弹出
6. 堆的分配:
- 堆表中记录空闲内存地址
- 寻找第一个大于申请空间的堆节点
- 在空间的首地址记录大小,方便delete
- 将剩余部分放回堆表
- 对于内建类型,new时不必保存分配长度,操作系统记录了对于带有析构函数的类型,new时自动保存长度,用来指示调用析构函数的次数。
7. 堆栈的生长方向:
- 栈由上向下生长,连续;
- 堆由下向上生长,不连续;
8. 函数的调用过程:
- 参数自右向左入栈;
- 函数返回地址入栈;
- 跳转;
- 原栈底EBP(栈底指针,地址最高)入栈,调整栈底为 EBP = ESP(栈顶指针,地址最低);
- 函数使用新的栈保存临时变量等。
9. 函数返回过程:
- 被调方将返回值放入EAX寄存器
- 清理堆栈(由调用方式决定由谁做这件事情)
- 调用方从EAX寄存器中获取返回值
10. 函数调用方式(调用者和被调用函数间传递参数及返回参数)
- __stdcall:windows API,由被调函数调整堆栈(调用方压参数,返回后,由被调用者清理堆栈,代码较小)
- __cdecl:ANSI C,由调用者调整堆栈(调用方压参数,返回后,调用者复原堆栈,代码较大,默认)
11. 二叉树遍历:
- 先序遍历:第一个为根节点
- 中序遍历:
- 后序遍历:最后一个为根节点,左右子树能够分开
- 由先序和中序遍历,可以确定恢复一棵二叉树(?)
12. 二叉树比较相等,递归比较左右子树
13. 图的表示方法:邻接矩阵表示法,邻接表法
14. 死代码检测:用图表示语句,从return中的变量开始遍历,没有遍历到的即为死代码。
15. 如果排序时,所有参与排序的元素都在内存中,则称为内排序
16. 时间复杂度:不带常数项和常数系数
- O(1) < O(log2n) < O(n) < O(nlogn) < O(n2) < O(n3) < O(2n)
17. Hash表:直接定址法,数字分析法,平方取中法,折叠法,取余法,随机数发