二叉搜索树(BST Binary Search Tree) 二叉排序树,二叉查找树
二叉搜索树:可以为空,如果不为空
①非空左子树的所有键值小于其根结点的键值
②非空右子树的所有键值大于其根结点的键值
③左右子树都是二叉搜索树
//Binary Search Tree操作的特别函数
Position Find(ElementType X,BinTree BST);
Position FindMin(BinTree BST);
Position FindMax(BinTree BST);
BinTree Insert(ElementType X,BinTree BST);
BinTree Delete(ElementType X,BinTree BST);
#include <stdio.h>
#include <stdlib.h>
typedef int ElementType;
typedef struct TNode* Position;
typedef Position BinTree; //二叉树类型
struct TNode //树结点定义
{
ElementType Data; //结点数据
BinTree Left; //指向左子树
BinTree Right; //指向右子树
};
//尾递归
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 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;
}
//查找最小元素的递归函数
Position FindMin(BinTree BST)
{
if(!BST)
return NULL; //空的二叉树返回NULL
else if(!BST->Left)
return BST; //找到最左叶结点并返回
else
return FindMin(BST->Left); //沿左分支继续查找
}
//查找最大元素的迭代函数
Position FindMax(BinTree BST)
{
if(BST)
{
while(BST->Right)
BST = BST->Right;
return BST;
}
else
return NULL;
}
//二叉搜索树的插入
BinTree Insert(ElementType X,BinTree BST)
{
if(!BST) //若原树为空,生成并返回一个结点的二叉搜索树
{
BST = (BinTree)malloc(sizeof(struct TNode));
BST->Data = X;
BST->Left = BST->Right = NULL;
}
else
{
if(X < BST->Data)
BST->Left = Insert(X,BST->Left);
else if(X > BST->Data)
BST->Right = Insert(X,BST->Right);
}
return BST;
}
//二叉搜索树的删除
/*考虑三种情况
①删除叶结点,直接删除,修改父结点指针为NULL
②删除的结点只有一个孩子结点,修改父结点的指针指向要删除结点的孩子结点
③要删除的结点有左右两棵子树,用另一结点替代被删除结点,右子树的最小元素或左子树的最大元素*/
BinTree Delete(ElementType X,BinTree BST)
{
Position Tmp;
if(!BST)
printf("not find the element you want to delete\n");
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(X,BST->Right); //在删除结点的右子树中删除最小元素
}
else //被删除结点有一个或无孩子结点
{
Tmp = BST;
if(!BST->Left) //有右孩子或无孩子结点
BST = BST->Right;
if(!BST->Right) //有左孩子或无孩子结点
BST = BST->Left;
free(Tmp);
}
return BST;
}