二叉树知识总结

选择题

1、在长度为n(n>1)的单链表上,设有头和尾两个指针,执行尾删操作与链表的长度有关

  • 头插:不需要遍历链表
  • 尾插:也不需要遍历链表
  • 头删:不需要遍历链表
  • 尾删:需要遍历单链表,找到尾节点的前一个节点,所以与长度有关

2、设根结点的深度为1,则一个拥有n个结点的二叉树的深度一定在[log(n + 1),n]区间内

  • 最大深度: 即每层只有一个节点,次数二叉树的高度为n,为最高的高度
  • 最小深度: 此树为完全二叉树, 则根据完全二叉树性质,高度为 h = log(n+1)

3、设某种二叉树有如下特点:每个结点要么是叶子结点,要么有2棵子树。假如一棵这样的二叉树中有m(m>0)个叶子结点,那么该二叉树上的结点总数为2m-1

  • 根据二叉树的性质,在任意的二叉树中,度为0的节点比度为2的节点多了1个
  • 现在叶子节点为m个,即度为0的节点有m个,那度为2的节点个数就为m-1个
  • 而该二叉树中只有度为2和度为0的节点 ,因此总的节点数就为:m+m-1 = 2m-1

4、 对任意一颗二叉树,设N0、N1、N2分别是度为0、1、2的结点数,则N0 = N2 + 1

  • 节点总数N: N = N0 + N1 + N2
  • N个节点的树有N-1个边: N - 1 = 0 * N0 + 1 * N1 + 2 * N2
  • 上面两个式子可以推出: N0 + N1 + N2 - 1 = N1 + 2 * N2 == N0 = N2 + 1

5、 二叉树的层序遍历相当于广度优先遍历,前序遍历相当于深度优先遍历

  • 广度优先遍历:将下一步所有可能的位置全部遍历完,才会进行更深层次的遍历
  • 深度优先遍历:先遍历完一条完整的路径(从根到叶子的完整路径),才会向上层折返,再去遍历下一个路径

6、如果一颗二叉树的前序遍历的结果是ABCD,则满足条件的不同的二叉树有14种 

  • 首先这棵二叉树的高度一定在3~4层之间:
  • 三层:
  • A(B(C,D),())、 A((),B(C,D))、A(B(C,()),D)、 A(B((),C),D)、A(B,C(D,()))、A(B,C((),D))
  • 四层:
  • 如果为四层,就是单边树,每一层只有一个节点,除过根节点,其他节点都有两种选择,在上层节点的左边还是右边,所以2*2*2共8种
  • 总共为14种

7、 树的根结点是所有结点的祖先结点

  • 树中的节点不能相交
  • 树的度为所有节点中度最大的节点的度
  • 树的深度为根节点到叶子节点的最大深度

  

8、设一棵二叉树中有3个叶子结点,有8个度为1的结点,则该二叉树中总的结点数为13个 

  • 设Ni表示度为i的节点个数,则节点总数 N = N0 + N1 + N2
  • 节点个数于节点边的关系: N个节点的树有N-1个边
  • 边与度的关系:N - 1 = N1 + 2 * N2
  • 故:N0 + N1 + N2 - 1 = N1 + 2 * N2
  • 因此,得:N0 = N2 + 1
  • 回到原题,N0 = 3,N1 = 8,可得N2 = 2。
  • 因此答案是 3 + 8 + 2 = 13

9、一颗完全二叉树有1001个结点,其叶子结点的个数是501

  • 在任意二叉树中,度为0的节点都比度为2的节点多1个,即 n0 = n2 + 1
  • 另外,在完全二叉树中,如果节点总个数为奇数,则没有度为1的节点(除去根节点后其余结点均配对),如果节点总个数为偶数,只有一个度为1的节点(除去根节点后其余结点只剩一个结点单身)
  • 因此:n0 + n1 + n2 = 1001 节点总数为奇数,没有度为1的节点
  • n0 + 0 + n2 = 2*n0-1 = 1001 n0 = 501

10、二叉树指最大孩子个数为2,即树的度为二的树。深度描述的为树的层数

  • 对于任意的树都满足:边的条数比节点个数少1,因为每个节点都有双亲,但是根节点没有
  • 一颗深度为 h 的满二叉树拥有 2^h-1 个结点(根结点深度为1)
  • 二叉链一般指孩子表示法,三叉链指孩子双亲表示法,这两种方式是二叉树最常见的表示方式,虽然还有孩子兄弟表示法,该中表示方式本质也是二叉链

11、一颗拥有1000个结点的树度为4,则它的最小深度是6

  • 如果这棵树每一层都是满的,则它的深度最小(不论是高度还是树的样子均按最坏的考虑)
  • 假设它为一个四叉树,高度为h,则这个数的节点个数为(4^h - 1) / 3
  • 当h = 5, 最大节点数为341
  • 当h = 6, 最大节点数为1365
  • 所以最小深度应该为6

12、在一颗度为3的树中,度为3的结点有2个,度为2的结点有1个,度为1的结点有2个,则叶子结点有6个 

  • 设度为i的节点个数为ni, 该树总共有n个节点,则n=n0+n1+n2+n3
  • 有n个节点的树的总边数为n-1条
  • 根据度的定义,总边数与度之间的关系为:n-1=0*n0+1*n1+2*n2+3*n3
  • 联立两个方程求解,可以得到n0 = n2 + 2n3 + 1,  n0=6

13、数据集的排列顺序对算法的性能无影响的有堆排序、归并排序、选择排序

  • 快排:初始顺序影响较大,越接近有序,性能越差
  • 插入:越接近有序,性能越好
  • 希尔:希尔是对插入排序的优化,这种优化是在无序的序列中才有明显的效果,如果序列接近有序,反而是插入最优
  • 堆排、归并:选择对初始顺序不敏感

14、 下列排序算法中,在待排序数据已有序时,花费时间反而最多的是快速排序

15、直接插入排序对[1, 3, 2, 4, 5, 6, 7, 8, 9]进行排序最快 

  • 次序列接近有序,所以如果是插入排序,时间复杂度逼近O(n)
  • 快排: 逼近O(n^2)
  • 归并和堆排仍然是nlogn

16、每一趟排序结束时都至少能够确定一个元素最终位置的方法是选择排序、快速排序、堆排序

  • 选择排序每次选一个最值,放在最终的位置
  • 快速排序每次基准值的位置也可以确定
  • 堆排序每次堆顶元素的位置也可以确定
  • 归并排序每次都需要对n个元素重新确定位置,所以不能保证每次都能确定一个元素位置,有可能每次排序所有元素的位置都为发生变化

17、快排的非递归是在模拟递归的过程,所以时间复杂度并没有本质的变化,但是没有递归,可以减少栈空间的开销。栈和队列都可以实现

18、 三数取中法能过保证快排的平均时间复杂度为nlogn,并不是在所有情况下都是最快的,比如完全有序的序列,冒泡排序可以做到O(n)(使用了标志位flag的冒泡排序)

19、下列选项中,不可能是快速排序第2趟排序后的结果的是C

  • A.2 3 5 4 6 7 9
  • B.2 7 5 6 4 3 9
  • C.3 2 5 4 7 6 9
  • D.4 2 3 5 7 6 9 
  • 快排的第二趟,即在第一趟快排的结果的基础上进行的,如果已经经过了一趟排序,则会通过第一趟选择的基准值划分两个子区间,每个子区间也会以区间内选择的基准值划分成两部分。
  • A: 第一趟的基准值可以为2, 第二趟的基准值可以为3
  • B: 第一趟的基准值可以为2, 第二趟的基准值可以为9
  • C: 第一趟的基准值只能是9,但是第二趟的基准值就找不出来,没有符合要求的值作为基准值,所以不可能是一个中间结果。
  • D: 第一趟的基准值可以为9, 第二趟的基准值可以为5

20、一棵非空的二叉树的先序遍历序列与后序遍历序列正好相反,则该二叉树一定满足只有一个叶子结点 

  • 前序遍历:根 左 右
  • 后序遍历:左 右 根
  • 从二叉树 前序 和 后序遍历结果规则中可以看出,如果树中每个节点只有一个孩子时,遍历结果肯定是反的
  • 比如下面这前序和中序序列所构成的树的结构::

二叉树知识总结_第1张图片

 21、已知某二叉树的前序遍历序列为ABDEC,中序遍历序列为BDEAC,则该二叉树不是完全二叉树

二叉树知识总结_第2张图片

22、在一颗完全二叉树中,某一个结点没有其左孩子,则该结点一定是叶结点

  • 完全二叉树中如果一个节点没有左孩子,则一定没有右孩子,必定为一个叶子节点,最后一层一定为叶子节点,但是倒数第二层也可能存在叶子节点。

~over~

你可能感兴趣的:(数据结构-初阶,算法,数据结构,c++,c语言)