面试题(错题)知识点总结

1、含有n个结点的二叉树的种类:C(n)=(1/(n+1))*((2*n)!/(n!*n!));

2、在选择题中,要注意switch语句中的break,没有就继续执行switch语句,有就结束执行;

3、度与结点数的公式可得 N-1=1*N1+2*N2+...+m*Nm (N表示总结点个数,N1表示含有一个子树,Nm表示含有m个子树)

4、哈夫曼树中只有度为1的(叶子)结点和度为2的结点

5、二叉树中设度为M,结点数为N,则:N=M+1(M=N0*0+N1*1+N2*2 . . .)

6、循环队列,其队头指针为front,队尾指针为rear;循环队列长度为N。其队内有效长度为:(rear - front + N) % N(假设队头不存放数据) ; 如果front中也存放数据时,则结果为:(rear-front+1+N)% N

7、HashMap的底层是以数组的形式进行存储的,将key-value对作为数组中的一个元素进行存储

  • Map.put()的时候,需要将key值映射为相应的hash值,key的值是以char数组的形式存放的,value对应的值也是有char数组存放的

  • HashMap和TreeMap比较

  1. HashMap:适用于在Map中插入、删除和定位元素。 
  2. Treemap:适用于按自然顺序或自定义顺序遍历键(key)。 
  3. HashMap通常比TreeMap快一点(树和哈希表的数据结构使然),建议多使用HashMap,在需要排序的Map时候才用TreeMap. 
  4. HashMap 非线程安全 TreeMap 非线程安全 
  5. HashMap的结果是没有排序的,而TreeMap输出的结果是排好序的

8、最小生成树之克鲁斯卡尔(Kruskal)算法(最小生成树)

è¿éåå¾çæè¿°

9、最小生成树之普里姆(Prim)算法(有权连通图)

  1. 过程:
  • 首先寻找一个起始结点,查看与这个结点相连的结点,找到权值最小的结点
  • 之后再寻找与这两个结点相连的结点并且权值最小的结点
  • 重复上述过程,当所有点找到时,那么结束程序

10、平衡二叉树的四种方式

  • 左子树深度 - 右子树深度=平衡因子
  • 若向平衡二叉树中插入一个新结点后破坏了平衡二叉树的平衡性。首先要找出插入新结点后失去平衡的最小子树根结点的指针。然后再调整这个子树中有关结点之间的链接关系,使之成为新的平衡子树。当失去平衡的最小子树被调整为平衡子树后,原有其他所有不平衡子树无需调整,整个二叉排序树就又成为一棵平衡二叉树。
  • 失去平衡的最小子树是指以离插入结点最近,且平衡因子绝对值大于 1 的结点作为根的子树。假设用 A 表示失去平衡的最小子树的根结点,则调整该子树的操作可归纳为下列四种情况。

  • ( 1 ) LL 型平衡旋转法

    由于在 A 的左孩子 B 的左子树上插入结点 F ,使 A 的平衡因子由 1 增至 2 而失去平衡。故需进行一次顺时针旋转操作。 即将 A 的左孩子 B 向右上旋转代替 A 作为根结点, A 向右下旋转成为 B 的右子树的根结点。而原来 B 的右子树则变成 A 的左子树。

    ( 2 ) RR 型平衡旋转法

    由于在 A 的右孩子 C  的右子树上插入结点 F ,使 A 的平衡因子由 -1 减至 -2 而失去平衡。故需进行一次逆时针旋转操作。即将 A的右孩子 C 向左上旋转代替 A 作为根结点, A 向左下旋转成为 C 的左子树的根结点。而原来 C 的左子树则变成 A 的右子树。

    ( 3 ) LR 型平衡旋转法

    由于在 A 的左孩子 B 的右子数上插入结点 F ,使 A 的平衡因子由 1 增至 2 而失去平衡。故需进行两次旋转操作(先逆时针,后顺时针)。即先将 A 结点的左孩子 B 的右子树的根结点 D 向左上旋转提升到 B 结点的位置,然后再把该 D 结点向右上旋转提升到 A 结点的位置。即先使之成为 LL 型,再按 LL 型处理 。

    如图中所示,即先将圆圈部分先调整为平衡树,然后将其以根结点接到 A 的左子树上,此时成为 LL 型,再按 LL 型处理成平衡型。

    ( 4 ) RL 型平衡旋转法

    由于在 A 的右孩子 C 的左子树上插入结点 F ,使 A 的平衡因子由 -1 减至 -2 而失去平衡。故需进行两次旋转操作(先顺时针,后逆时针),即先将 A 结点的右孩子 C 的左子树的根结点 D 向右上旋转提升到 C 结点的位置,然后再把该 D 结点向左上旋转提升到 A 结点的位置。即先使之成为 RR 型,再按 RR 型处理。

    如图中所示,即先将圆圈部分先调整为平衡树,然后将其以根结点接到 A 的左子树上,此时成为 RR 型,再按 RR 型处理成平衡型。

    平衡化靠的是旋转。 参与旋转的是 3 个节点(其中一个可能是外部节点 NULL ),旋转就是把这 3 个节点转个位置。注意的是,左旋的时候 p->right 一定不为空,右旋的时候 p->left 一定不为空,这是显而易见的。

    如果从空树开始建立,并时刻保持平衡,那么不平衡只会发生在插入删除操作上,而不平衡的标志就是出现 bf == 2 或者  bf == -2的节点。

11、双端队列中的输入受限,和输出受限

  • 输入受限:只能从一端输入
  • 输出受限:只能从一端输出

12、

13、final的特点:

  • final修饰类、方法、属性!不能修饰抽象类,因为抽象类一般都是需要被继承的,final修饰后就不能继承了。
  • final修饰的方法不能被重写而不是重载! 
  • final修饰属性,此属性就是一个常量,不能被再次赋值! 

猜你喜欢

转载自blog.csdn.net/Future_LL/article/details/81235142