推出一个新系列,《看图轻松理解数据结构和算法》,主要使用图片来描述常见的数据结构和算法,轻松阅读并理解掌握。本系列包括各类堆、各类队列、各类列表、各类树、各类图、各类排序等等几十篇的样子。mysql
对于树的数据结构你们都了解,只是树的类型有不少,因此可能又会对树产生一种陌生感。树其实就是由有限n(n>=1)个节点组成的一个具备层次关系的集合,它看起来像一棵倒挂的树,因此称之为“树”。算法
二叉搜索树(Binary Search Tree,简写BST),又称为二叉排序树,属于树的一种,经过二叉树将数据组织起来,树的每一个节点都包含了健值 key、数据值 data、左子节点指针、右子节点指针。其中健值 key 是最核心的部分,它的值决定了树的组织形状;数据值 data 是该节点对应的数据,有些场景能够忽略,举个例子,key 为身份证号而 data 为人名,经过身份证号找人名;左子节点指针指向左子节点;右子节点指针指向右子节点。sql
对于下面这棵树,插入D
和H
,网络
建立D
节点并与根节点比较,数据结构
D 小于 E,因而往左子节点继续比较,并发
D 大于 C,应该往右子节点方向,而此时 C 节点的右子节点指针为空,D 节点能够放置进去。机器学习
一样的,对于 H 节点,先建立 H 节点并与根节点比较,数据结构和算法
H 大于 E,因而往右子节点继续比较,学习
H 大于 G,应该往右子节点方向,而此时 G 节点的右子节点指针为空,H 节点能够放置进去。.net
二叉搜索树的形状与节点插入顺序不一样而可能不一样,好比对于A B C D E F G H
这些节点集,按E C A B D G F H
顺序插入则为,
而若是调换前面两个节点,按照C E A B D G F H
顺序插入则以下图,形状差异仍是挺大的,
极端状况下,按照A B C D E F G H
顺序插入,则为,
对于下图的树查找 key 值为“B”和“G”的节点,
“B”与根节点的 key 值比较,
“B”小于“E”,往左子节点继续寻找,
“B”小于“C”,往左子节点继续寻找,
“B”大于“A”,往右子节点继续寻找,二者相等,找到。
继续查询 key 值为“G”的节点,与根节点比较,
“G”大于“E”,往右子节点,二者相等,找到。
删除操做分三种状况进行,
1 2 3 4 5
中4就是3的后继。前驱就是删除节点前面那个节点,好比1 2 3 4 5
中2就是3的前驱。删除“B”叶子结点,从根节点开始查找,
找到,直接删除,
假如树的结构以下图,如今要删除“C”节点,
从根节点开始找,
找到“C”节点,直接将原来指向“C”节点的右子节点指针指向“C”的子节点,
最终为,
要在以下的树中删除“E”节点,
“E”节点存在两个子节点,因而开始寻找“E”节点的中序前驱来替换它,前驱在左子节点“C”下最大值的那个节点,
要找“C”节点下最大值节点则一直往右,
直到不能继续往下,即“D”节点便是前驱,用“D”节点来替换“E”节点,
最终实现将“E”节点删除。
-------------推荐阅读------------
个人开源项目汇总(机器&深度学习、NLP、网络IO、AIML、mysql协议、chatbot)
跟我交流,向我提问:
欢迎关注: