【总结】二叉搜索树

简单介绍

二叉搜索树又叫二叉查找树。

是一种数据结构,支持多种动态集合操作,包括查找,返回最小值,返回最大值,返回前驱和后继节点,插入和删除

它既可以用作字典,也可以用做优先队列。

如果一颗二叉树满足这样的特性:

设 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)

原文地址:https://www.cnblogs.com/huixinxinw/p/12208908.html