什么是二叉搜索树
一棵二叉树,可以为空也可以不为空。满足以下性质:
1、非空左子树的所有键值都小于其根节点的键值。
2、非空右子树的所有键值都大于其根节点的键值。
3、左、右子树都是二叉搜索树。
二叉树操作的特别函数
1、根据键值找地址
//递归法
Position Find(ElementType X,BinTree BST){
if(!BST){
return NULL;
}
if(X>BST->Data){
return Find(X,BST->Right);
}else if(X<BST->Data){
return Find(X,BST->Left);
}else{
return BST;
}
}
//迭代法
Position IterFind(ElementType X,BinTree BST){
while(BST){
if(X>BST->Data){
BST=BST->Right;
}else if(X<BST->Data){
BST=BST->Left;
}else{
return BST;
}
}
return NULL;
}
2、找最小值的地址
Position FindMin(BinTree BST){
if(!BST){
return NULL;
}else if(!BST->Left){
return BST;
}else{
return FindMin(BST->Left);
}
}
3、找最大值的地址
Position FindMax(BinTree BST){
if(!BST){
while(BST->Right){
BST=BST->Right;
}
}
return NULL;
}
4、插入指定元素
BinTree Insert(ElementType X,BinTree BST){
if(!BST){ //若为空
BST=malloc(sizeof(struct TreeNode));
BST->Data=X;
BST->Left=BST->Right=NULL;
}else{ //开始插入
if(X<BST->Data){
BST->Left=Insert(X,BST->Left);
}
if(X>BST->Data){
BST->Right=Insert(X,BST->Right);
}
}
return BST;
}
eg:以一年十二个月的英文缩写为键值,按从一月到十二月顺序输入,即输入序列为(Jan,Feb,Mar,Apr,May,Jun,July,Aug,Sep,Oct,Nov,Dec )
结果如下:(按照音序)
5、删除指定元素
(1)删除叶结点:
(2)删除有一个孩子的结点:将父结点的指针指向被删除结点的孩子结点
(3)删除有两个孩子的结点:用右子树的最小值或者左子树的最大值替代被删除结点
BinTree Delete(ElementType X,BinTree BST){
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;
}
Q:在下图搜索树中删除结点1,那么删除后该搜索树的后序遍历结果?
A:243765