【总结】二叉搜索树
简单介绍
二叉搜索树又叫二叉查找树。
是一种数据结构,支持多种动态集合操作,包括查找,返回最小值,返回最大值,返回前驱和后继节点,插入和删除
它既可以用作字典,也可以用做优先队列。
如果一颗二叉树满足这样的特性:
设 x为二叉查找树中的一个节点。
1.如果 y是x 的左子树的一个节点,则 key[y] <= key[x].
2.如果 y是x 的右子树的一个节点,则 key[x] <= key[y].
那么则称它为二叉查找树
二叉查找树是学习平衡树的基础
基本操作
1.查询
如果在数组中我们想寻找一个元素k,时间复杂度为O(n)
二叉搜索树中查询的话,如果k的值大于当前节点,就去搜索当前节点的右子树,如果k的值小于当前节点,就去搜索当前节点的左子树
这样时间复杂度就为O(树的高度)
Tree-Search(x, k)
if x == NULL or k == key[x]:
return x
if k < key[x]:
return Tree-Search(left[x], k)
else
return Tree-Search(right[x], k)
2.遍历
我们可以对一个二叉搜索树进行中序遍历
inorder(x):
if x != NULL:
inorder(left[x])
print key[x]
inorder(right[x])
调用这个函数我们就可以输出一个二叉搜索树种的所有元素
3.插入
同样搜索,直到遇到一个节点,
如果我要插入的元素大于节点的值并且当前节点没有右儿子,就将插入的元素放到当前节点的右儿子上。
或者我要插入的元素小于当前节点的值并且当前节点没有左儿子,就将插入的元素放到当前节点的左儿子上。
Tree-Insert(T, z):
y = NULL, x = root[T]
while x != NULL:
y = x
if (key[z] < key[x]) x = left[x];
else x = right[x]
parent[z] = y
if y == NULL then root[T] = z
else if key[z] < key[y] then left[y] = z
else right[y] = z
如果要删除元素,则需要分四种情况讨论,比较复杂
4.查询最大最小元素
最小元素:从根节点开始,沿着各节点的 left 指针查找下去
Tree-Minimum(x):
while left[x] != NULL:
x = left[x]
return x
最大元素:从根节点开始,沿着各节点的right指针查找
Tree-Maximum(x):
while right[x] != NULL:
x = right[x]
return x
随机构造的二叉查找树
我们已经知道,二叉查找树上的各基本操作的运行时间都是O(h),h 为树的高度。
但是随着元素的插入或删除,树的高度会发生变化。
例如,如果各元素按严格增长的顺序插入,那么构造出的树就是一个高度为 n - 1 的链。
如果各元素按照随机的顺序插入,则构造出的二叉查找树的期望高度为 O(log n)