【数据结构】二叉搜索树
查找问题:静态查找和动态查找
二叉搜索树(Binary Search Tree, BST)
-
定义
二叉搜索树,又称为二叉排序树或二叉查找树
二叉搜索树:一棵二叉树,可以为空;如果不为空,满足以下性质:
(1)非空左子树的所有键值小于其根结点的键值
(2)非空右子树的所有键值大雨其根结点的键值
(3)左、右子树都是二叉搜索树 -
二叉搜索树的特别函数
Position Find(ElementType X, BinTree BST)
Position FindMin(Bintree BST)
Position FindMax(Bintree BST)
Position Find(ElementType X, BinTree BST){
if(!BST) return NULL;
if(X>BST->Data)
return Find(X,BinTree->Right);
if(X<Bst->Data)
return Find(X,BinTree->Left);
else
return BST;
}
尾递归都可以用循环迭代来实现
Position Find(ElementType X, BinTree BST){
BinTree TmpTree=BST;
while(!TmpTree){
if(X>TmpTree->Data)
TmpTree=TmpTree->Right;
if(X<TmpTree->Data)
TmpTree=TmpTree->Left;
else
return TmpTree;
}
return NULL;
}
查找的效率取决于树的高度
递归求最小元素
Position FinMin(BinTree BST){
if(!BST) return NULL;
else if(!BST->Left)
return BST;
else
return FindMin(BST->Left)
}
迭代求最小元素
Position FinMin(BinTree BST){
BinTree BT=BST;
if(BT==NULL) return NULL;
else{
while(!(BT->Left)) BT=BT->Left;
return BT;
}
}
二叉搜索树的插入
分析:关键是要找到元素应该插入的位置,可以采用与Find类似的方法
BinTree Insert(ElementType X,BinTree BST){
if(!BST){
BST=malloc(sizeof(struct TreeNode));
BST->Data=Element;
BST->Left=BST->Right=NULL;
}
else
if(X<BST->Data)
BST->Left = Insert(X,BST->Left);
BST->Right = Insert(X,BST->Right);
return BST;
}
二叉搜索树的删除
三种情况:
要删除叶结点:直接删除,在修改其父结点指针——置为NULL
要删除的结点只有一个孩子:将其父结点的指针指向要删除结点的孩子结点
要删除的结点有左、右两棵子树:用另一结点替代被删除的结点:右子树的最小元素或左子树的最大元素
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;
}