**
对二叉搜索树的浅理解(学习中)
二叉搜索树
-
插入某一条数据:
# 找不到就创建新的顶点 if insertion point is found # 如果插入的数据大于或者小于比对的数据 if value to be inserted < this key go left else go right
-
插入一个数据(以25为例)
- 将25与15比较---->25大于15,所以向右
- 将25与50比较---->25小于50,所以向左
- 将25与23比较---->25大于23,所以向右插入25
-
!!!手动高亮注意!!!
- 本二叉树是平衡二叉树(AVL)
- 就是插入数据的时候需要考虑树是否能保持平衡(左右子树的高度差值不能超过1即为平衡)
- 如果不平衡的话要进行节点旋转来调整成为平衡状态
- 后面接下来我会重点学习这个,这里只是举个浅显的插入例子而已!!!
-
搜索一条数据:
# 如果找不到数据 if this == null return null # 找到了数据 else if this key == search value return this # 搜索数据的判断 else if this key < search value search right else search left
-
后继
-
二叉树中序遍历的序列中,某个结点紧随的那个结点,比如下图中:
-
快速寻找当前节点(point)的后继结点:
①. 如果point节点有右子树, 那么就是右子树上最左的结点,例如图中节点6的右子树的最左节点是7; 50的右子树最左节点是71, 15的右子树最左节点是23等.
②. 如果point节点没有右子树, 那么也分两种情况:
a.看point节点是否为它父节点的左孩子(左面的子节点), 如果是,那么它的父亲就是它的后继, 如 4的后继为6, 23的后继为50等.
b.如果ponit为父节点的右孩子(右边的子节点), 那么它会以父节点开始出发, 往上寻找, 直到找到某个节点是其父节点的左子节点时,那么该某节点的父节点为point的后继. 如: 5的后继为6, 7的后继为15等.
if this.right != null return findMin(this.right) else p = this.parent, T = this while(P != null && T ==p.right) T = p, p = T.parent 如果p等于null返回-1 否则返回p
-
-
前驱
-
前驱的寻找可以参考后继
①. 如果point节点有左子树, 那么就是左子树上最右的节点,例如图中节点50的左子树既是它的最右节点23; 6的左子树最右节点是5; 15的左子树最右节点是7等.
②. 如果point节点没有左子树, 那么也分两种情况:
a.看point节点是否为其父节点的右孩子(右面的子节点), 如果是,那么它的父亲就是它的前驱, 如5的前驱为4, 71的前驱为50等.
b.如果ponit为其父节点的左孩子(左边的子节点), 那么它会以父节点开始出发, 往上寻找, 直到找到某个节点是其父节点的右子节点时,那么这个节点的父节点为point的前驱. 如: 23的前驱为15.
if this.left != null return findMax(this.left) else p = this.parent, T = this while(p != null && T == p.left) T = p, p = T.parent 如果p等于null返回-1 否则返回P
-
-
中序遍历
如果这是null
返回
inOrder(left)
访问这个, 然后inOrder(right)
上图中序遍历结果是: 4, 5, 6, 7, 15, 23, 50, 71
-
删除
-
以刚插入还热乎的25为例(此节点没有子节点)
- 搜索并删除节点25
- 节点25没有子节点,它是叶节点
- 删除叶节点25
- 此处也要考虑二叉树的平衡!!!
- 所以这里也先简单的删除一下,平衡先往后放一放…
-
如果要删除4节点(此节点有子节点)
- 删除4的子节点并将其父节点连接到其右子节点
- 删除完成
2019.11.29
先这样~
-