二叉搜索树:维基百科:click here

二叉查找树Binary Search Tree),也称二叉搜索树、有序二叉树(ordered binary tree),排序二叉树(sorted binary tree),是指一棵空树或者具有下列性质的​​二叉树​​:

  1. 若任意节点的左子树不空,则左子树上所有结点的值均小于或等于它的根结点的值;
  2. 任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
  3. 任意节点的左、右子树也分别为二叉查找树。
  4. 没有键值相等的节点(no duplicate nodes)。二叉查找树相比于其他数据结构的优势在于查找、插入的时间复杂度较低。为O(log n)。二叉查找树是基础性数据结构,用于构建更为抽象的数据结构,如​​集合​​​、​​multiset​​​、​​关联数组​​等。

二叉查找树的查找过程和​​次优二叉树​​​类似,通常采取二叉​​链表​​​作为二叉查找树的​​存储结构​​。中序遍历二叉查找树可得到一个关键字的有序序列,一个无序序列可以通过构造一棵二叉查找树变成一个有序序列,构造树的过程即为对无序序列进行查找的过程。每次插入的新的结点都是二叉查找树上新的叶子结点,在进行插入操作时,不必移动其它结点,只需改动某个结点的指针,由空变为非空即可。搜索、插入、删除的复杂度等于树高,期望

,最坏

(数列有序,树退化成线性表)。虽然二叉查找树的最坏效率是O(n),但它支持动态查询,且有很多改进版的二叉查找树可以使树高为

,如​​SBT​​​,​​AVL树​​​,​​红黑树​​等。故不失为一种好的动态查找方法。

《数据结构复习笔记》--二叉搜索树_acm

《数据结构复习笔记》--二叉搜索树_二叉搜索树_02

《数据结构复习笔记》--二叉搜索树_结点_03

这里我们可以发现:在一个二叉搜索树中,最大元素和最小元素的位置是有规律的。

《数据结构复习笔记》--二叉搜索树_子树_04

《数据结构复习笔记》--二叉搜索树_子树_05


《数据结构复习笔记》--二叉搜索树_结点_06

《数据结构复习笔记》--二叉搜索树_结点_07

BinTree Delete( ElementType X, BinTree BST )
{
Position Tmp;
if( !BST ) printf("要删除的元素未找到");
else if( X < BST->Data )
BST->Left = Delete( X, BST->Left); /* 左子树递归删除 */
else if( X > BST->Data )
BST->Right = Delete( X, BST->Right); /* 右子树递归删除 */
else /*找到要删除的结点 */
if( BST->Left && BST->Right ) /*被删除结点有左右两个子结点 */
{
Tmp = FindMin( BST->Right );
/*在右子树中找最小的元素填充删除结点*/
BST->Data = Tmp->Data;
BST->Right = Delete( BST->Data, BST->Right);
/*在删除结点的右子树中删除最小元素*/
}
else /*被删除结点有一个或无子结点*/
{
Tmp = BST;
if( !BST->Left ) /* 有右孩子或无子结点*/
BST = BST->Right;
else if( !BST->Right ) /*有左孩子或无子结点*/
BST = BST->Left;
free( Tmp );
}
return BST;
}