二叉树 ( Binary Tree ) : 一种树型结构,每个节点最多拥有两个节点。( 如下图 )
几种类型的二叉树
1. full binary tree: 每个节点的孩子数 是 0 或者 2. 对高度没有要求。 如下图
2. perfect binary tree: 这个就是最完美的树,顾名思义,所有叶子节点都有相同的深度,并且除了叶子节点剩下的所有节点都有两个孩子节点。
3. complete binary tree: 除了最后的那一层,其他层必须被填满,并且对于最后一层必须从最左开始填满。
二叉查找树:
1. 所有的字数都必须满足, 左节点的值小于根节点,根节点小于右节点.
2. 空间复杂度为O(n)
3. 搜索/插入/删除 的时间复杂度: 最优 O(log n) 最差 O (n)
为什么是log? 因为当比较的时候,我们能通过每次的比较过滤掉一半的树结构。
对于二叉查找树:
查询/插入都很浅显易懂。
对麻烦的是删除节点。
二叉查找树的删除节点:
1. 删除一个没有子节点的节点 - 直接移除该节点
2. 删除一个有一个子节点的节点 - 直接移除该节点,并且将它的子节点置换到被删除的节点的位置上
3. 删除一个有两个子节点的节点 - 定义 将要被删除的节点为N, 定义 另一个节点 为 R, R节点 是 来自 该树 in-order 序列的N节点之前的那一个节点。然后将R的值赋值给N,
如果R不满足 以上的条件1 或者 2那么,将R作为N, 进行递归.
比如: in-oder 序列 1, 3, 4, 6, 7, 8, 10, 13, 14. 我们想要删除10, 那么10 为N, R为8.
例子: 在以上的树结构中,删除节点 10.
1. 根据 in-order 找到R为8, N为10, 将N的值赋值为 8。
2. 因为此时的R不满足1 或者 2 条件,所以继续。
3. 将 R 变成N, 并找到新的R 7.
4. 7 满足条件 1 或者 2。
5. 结束。
有问题欢迎指出