数据结构学习-二叉搜索树-查找、插入、删除

来源:互联网 发布:如何破解MD5的网络包 编辑:程序博客网 时间:2024/05/18 00:29

#2017-12-12  2:00

#武汉工程大学邮电与信息工程学院邮科院校区

#软件工程1604谷子毅


二叉搜索树
也叫二叉排序树或二叉查找树


一颗二叉树,可以为空;如果不空,满足以下性质: 
1.非空左子树的所有键值小于根节点
2.非空左子树的所有键值小于根节点
3.左右子树都是二叉搜索数  


部分函数:
1.查找元素X,返回地址 
2.查找最小元素,返回地址 
3.查找最大元素,返回地址 
4.插入
5.删除


/*查找查找从根结点开始,如果树空,返回NULL若非空,根结点与X比较,进行不同处理1.X小于,只需左边继续搜索2.X大于,只需右边继续搜索  3.X等于,返回结点指针 */ /*递归方法*/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(X==BST->Data)return BST;} /*非递归方法: 效率决定于树的高度*/ Position Find(ElementType X,BinTree BST){while(BST){if(X<BST->Data)BST=BST->Left;else if(X>BST->Data)BST=BST->Right;elsereturn BST}return NULL;}


/*查找最大,最小元素*/ //最大元素一定在树的最右分枝的端结点 //最小元素一定在树的最左分枝的端结点 /*查找最小元素递归法*/Position FindMin(BinTree BST){if(!BST) return NULL;else if(!BST->Left)return BST;elseFindMin(BST->Left);}/*查找最大元素非递归法*/Position FindMax(BinTree BST){if(BST)while(BST->Right)BST=BST->Right;return BST;} 


/*二叉搜索树的插入*///关键是要找到元素应该插入的位置//可以采用与Find类似的方法BinTree Insert(ElementType X,BinTree BST){if(!BST){/*原树为空,则造一个根节点*/BST=malloc(sizeof(struct TreeNode))BST->Data=X;BST->Left=BST->Right=NULL;}/*开始找要插入元素的位置*/ elseif(X<BST->Data)BST->Left=Insert(X,BST->Left)/*递归插入左子树*/ else if(X>BST->Data)BST->Right=Insert(X,BST->Right)/*递归插入右子树*//*else 若X已存在,则什么都不做*/  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;} 


阅读全文
0 0