第二十三节-二叉树基础(上)

  • 根节点:没有父节点的节点
  • 叶节点:没有子节点的节点
  • 节点的高度:节点到叶子节点的最长路径,从 0 开始
  • 节点的深度:根节点到这个节点所经历的边的个数,从 0 开始
  • 节点的层数:节点的深度 + 1
  • 树的高度:根节点的高度

二叉树

  • 满二叉树:除了叶子节点之外,其他节点都有左右两个孩子节点。
  • 完全二叉树:叶子节点都在最下面两层,最后一层的叶子节点都靠左排列,除了最后一层的节点,其他层的节点都要排满。

完全二叉树天然适合用数组存储,若是有哨兵位置,如果每个节点 X 存储在数据下标为 i 的位置上,则每个节点若是有左儿子,则左儿子在 2 * i 位置上,若是有右儿子,右儿子必在 2 * i + 1 的位置上。

第二十三节-二叉树基础(上)_第1张图片

从整个数组来看,空间被充分利用起来(除了哨兵位置,但是哨兵位置带来的优化也是很不错的),利用了数组的优点,访问父子节点的速度快很多,还天然支持按层遍历。

堆其实就是一种完全二叉树。

课后思考

  1. 什么样的二叉树适合用数组存储

最完美的情况当然是完全二叉树。但是我思考了下,如果我们的业务场景中,构造的树缺少了极个别的节点,不能构成完全二叉树,但是非常接近完全二叉树,我认为还是可以用数组存储的。毕竟我们做工程,不是要追求学术上的某一指标绝对最优,整体最优才是我们更应该考虑的。

  1. 给定一组数据,比如 1,3,4,5,9,10。可以构建出多少种不同的二叉树?

根据卡特兰数计算,C(6) = c[12,6]/7 = 132 种

  1. 按层遍历如何实现?

数组存储的树,直接遍历。链表存储的树,用队列实现。

你可能感兴趣的:(第二十三节-二叉树基础(上))