二叉搜索树是一种相当常见的树,因为它能在将数据保持在有序的状态的情况下,高效地访问、搜索、插入和删除值。
假设有如下一系列数字:
1000 个元素只需 10 次查找!
关于二叉搜索树的另一个重要地方是它和链表很像,在添加或删除值时只需要更新紧邻的项即可。
实现空二叉搜索树数据结构可以提供以下一些运算:
一个生成空二叉搜索树的构造函数;
判断元素是否在二叉搜索树中;
将元素添加到二叉搜索树中;
下面我们将依次介绍其实现。
一个生成空二叉搜索树的构造函数
和 Tree 一样,需要一个二叉搜索树的根节点。
constructor() {
this.root = null;
}
判断元素是否在二叉搜索树中
为了判断值是否存在于树中,首先需要搜索树。
contains(value) {
// 从根节点开始
// 只要有节点可以访问,持续运行。如果到达一个值为 null 的左子节点或右子节点,那么循环结束。
// 如果值大于 current.value 向右移动
// 如果值小于 current.value 向左移动。
// 否则,即等于 current.value 返回 true。
// 如果没有匹配,返回 false。
}
将元素添加到二叉搜索树中
在添加之前,参考上面先进行遍历,找到适合添加的节点的位置。当到达一个为 null 的 left 或 right 时,将在该位置添加一个新节点。
add(value) {
// 首先创建节点
let node = {
value: value,
left: null,
right: null
};
// 当根节点为 null 时,只需要将该节点设置为根节点
// 从根节点开始
let current = this.root;
// 循环直到成功添加节点或发现它已经存在
while (true) {
// 如果值大于 current.value 向右移动
// 如果 right 不存在,则将其设置为新建的节点,并停止遍历
// 否则,移动到右子节点
// 如果该值小于 current.value 向左移动。
// 如果左子节点不存在,则将其设置为新建的节点,并停止遍历。
// 否则,移动到左子节点
// 如果既不小于也不大于,那么它和 current.value 相等,节点已存在,什么也不做。
}
}
运行