#include<bits/stdc++.h>
#define MaxSize 100
using namespace std;
typedef struct TreeNode
{//定义二叉树结构
char Data;
struct Node *lchild,*rchild;
}*BiTree,BiTNode;
//查找1
BiTNode Find( int X, BiTree BST ) {
if( !BST )
return NULL; /*查找失败*/
if( X > BST->Data )
return Find( X, BST->rchild ); /*在右子树中继续查找*/
else if( X < BST->Data )
return Find( X, BST->lchild ); /*在左子树中继续查找*/
else /* X == BST->Data */
return BST; /*查找成功,返回结点的找到结点的地址*/
}
//查找2(非递归)
BiTNode IterFind( int X, BiTree BST ) {
while( BST ) {
if( X > BST->Data ) BST = BST->rchild; /*向右子树中移动,继续查找*/
else if( X < BST->Data )
BST = BST->lchild; /*向左子树中移动,继续查找*/
else /* X == BST->Data */
return BST; /*查找成功,返回结点的找到结点的地址*/
}
return NULL; /*查找失败*/
}
//查最小(递归)
BiTNode FindMin(BiTree BST){
if(!BST)
return NULL;
else if(!BST->lchild)
return BST;
else
return FindMin(BST->lchild);
}
//查最大(迭代)
BiTNode FindMax(BiTree BST){
if(BST)
while(BST->rchild)
BST = BST->rchild;
return BST;
}
//插入
BiTree Insert( int X, BiTree BST ) {
if( !BST ){
/*若原树为空,生成并返回一个结点的二叉搜索树*/
BST = malloc(sizeof(struct TreeNode));
BST->Data = X;
BST->lchild = BST->rchild = NULL;
}else /*开始找要插入元素的位置*/
if( X < BST->Data )
BST->lchild = Insert( X, BST->lchild);
/*递归插入左子树*/
else if( X > BST->Data )
BST->rchild = Insert( X, BST->rchild); /*递归插入右子树*/
/* else X已经存在,什么都不做 */
return BST;
}
//删除
BiTree Delete( int X, BiTree BST ) {
BiTNode Tmp;
if( !BST ) printf("要删除的元素未找到");
else if( X < BST->Data )
BST->lchild = Delete( X, BST->lchild); /* 左子树递归删除 */
else if( X > BST->Data )
BST->rchild = Delete( X, BST->rchild); /* 右子树递归删除 */
else /*找到要删除的结点 */
if( BST->lchild && BST->rchild ) { /*被删除结点有左右两个子结点 */
Tmp = FindMin( BST->rchild );
/*在右子树中找最小的元素填充删除结点*/
BST->Data = Tmp->Data;
BST->rchild = Delete( BST->Data, BST->rchild);
/*在删除结点的右子树中删除最小元素*/
} else { /*被删除结点有一个或无子结点*/
Tmp = BST;
if( !BST->lchild ) /* 有右孩子或无子结点*/
BST = BST->rchild;
else if( !BST->rchild ) /*有左孩子或无子结点*/
BST = BST->lchild;
free( Tmp );
}
return BST;
}