[原创] 程序员面试宝典:第十三章 数据结构基础

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表:直接定址法,数字分析法,平方取中法,折叠法,取余法,随机数发
原文地址:https://www.cnblogs.com/icemoon1987/p/2709573.html