社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
极客时间王争的《数据结构与算法之美》树相关课程笔记
根节点,父节点,子节点,兄弟节点,叶子节点/叶节点
每个节点最多两个子节点:左子节点,右子节点
满二叉树
完全二叉树
满二叉树就是一种完全二叉树
二叉树的存储分两种:链式存储 和 数组存储
完全二叉树的优势在于用数组存储不浪费空间。
数组的第0个空着,从第1位开始存根节点,然后每一层从左到右依次存储,每个节点的左子节点在数组中的下标位置是自己下标2,右子节点自然就是2+1
如上图,一棵完全二叉树,仅仅“浪费”了一个下标为 0 的存储位置。如果是非完全二叉树,其实会浪费比较多的数组存储空间。如下图
前序,中序,后续遍历
怎么记住呢,这个前中后就是父节点在前,在中还是在后
从根节点出发:
需要注意,上面描述中不是左节点,右节点,而是左子树和右子树,这就体现出一个递归的概念了。结合下面的例子理解:
为快速搜索,插入,删除而生
每个节点的左子节点必须比自己小,右子节点必须比自己大
前面说了查找效率和树的深度有关,最完美的情况就是完全二叉树(深度最小),那怎么知道一棵有n个节点的完全二叉树的深度?
下面n是节点个数,L是层数,为啥有大于和小于呢,因为最后一层的节点数量在1个到2^(L-1)个之间啦
n >= 1+2+4+8+...+2^(L-2)+1
n <= 1+2+4+8+...+2^(L-2)+2^(L-1)
反正最后算出来插入、删除、查找操作的时间复杂度也比较稳定,是 O(logn)。 至于怎么算出来的,什么等比数列公式啥的,恕我直言忘得差不多了。
想想上面的二叉查找数,如果按照从小到大,或者从大到小的顺序插入数据,那画面就很美丽了,直接退化为链表:
所以出现了平衡二叉查找树,目的是确保数的深度不会太大,严格的平衡二叉树定义是:
任何节点的左右子树高度相差不超过 1
但是一秒打脸,大名鼎鼎的红黑树 (R-B Tree) 并不严格符合平衡二叉树的定义,因为二叉树的维护(插入,删除)和查找效率是需要平衡的,如果严格按照平衡二叉树的定义来做(例如AVL树),虽然查询效率贼高,但是维护的代价很大。红黑树平衡了这两者,所以是另一种含义的“平衡”二叉树了。
红黑树的定义:
未完待续
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!