搜索二叉树的定义及操作

来源:互联网 发布:mysql 传入动态参数 编辑:程序博客网 时间:2024/06/07 03:04

一.定义:
二叉搜索树是满足以下性质的二叉树。
1.非空左子树的所有键值小于其根结点的键值;
2.非空右子树的所有键值大于其根结点的键值;
3.左右子树都是二叉树。


二.二叉搜索树的储存:
二叉搜索树的储存和普通二叉树的储存一样,一般用链表储存。


三.二叉搜索树的查找:
1.查找关键字为X的结点,返回其所在的地址:
将X值与结点值做对比,如果相等那么这个数找到,如果小于应该再递归在左子树上找,如果大于应该再递归在右子树上找,如果递归到所有结点为空,那么停止查找。

BinTree Find(int x, BinTree BST){    if(!BST)        return NULL;    //没找到    if(x > BTS->Data)        return Find(x,BST->Right);    else if(x < BTS->Data)        return Find(x,BST->Left);    else        return BST;     //找到,返回地址}

2.查找二叉搜索树的最大和最小元素
最大元素和最小元素分别在最右端点和最左端点。
不断往左(右)递归,找到最左(右)端点即可。
最小元素:

BinTree FindMin(BinTree BST){    if(!BST)        return NULL;    //空树    if(!BST->Left)        return BST;    else        return FindMin(BST->Left);}
BinTree FindMin(BinTree BST){    if(BST)    {        while(BST->Left)            BST = BST->Left;    }    return BST;}

最大元素是把Left改成Right;


四.二叉搜索树的插入和删除
1.插入操作:将元素X插入二叉搜索树关键找到元素应该插入的位置。
将X值与结点值做对比,如果相等那么这个数已经存在,如果小于应该再递归在左子树上找,如果大于应该再递归在右子树上找,如果找到结点为空,那么将结点赋值。

BinTree Insert( BinTree BST, ElementType X ){    if(!BST)    {        BST = (BinTree)malloc(sizeof(struct TNode));        BST->Data = X;        BST->Left = BST->Right = NULL;    }    else    {        if(X < BST->Data)            BST->Left = Insert(BST->Left,X);        else if(X > BST->Data)            BST->Right = Insert(BST->Right,X);    }    return BST;}

2.删除操作:
如果没找到不处理,如果查找到那个点,继续操作:如果左右子树都非空,那么查找左子树的最大值(右子树的最小值)代替这个删去的位置,并再删去这个我们用来代替的数的原来位置;如果只有左子树(右子树)非空,那么用左子树(右子树)的根代替,如果本身就是叶子结点那么删去即可。

BinTree Delete( BinTree BST, ElementType X ){    BinTree Tmp;    if(!BST)    {        puts("Not Found");        return NULL;    }    else    {        if(X < BST->Data)            BST->Left = Delete(BST->Left,X);        else if(X > BST->Data)            BST->Right = Delete(BST->Right,X);        else        {            if(BST->Right && BST->Left)            {                Tmp = FindMin(BST->Right);                //Tmp = FindMax(BST->Left);                BST->Data = Tmp->Data;                BST->Right = Delete(BST->Right,Tmp->Data);                //BST->Left = Delete(BST->Left,Tmp->Data);            }            else            {                if(!BST -> Left)                    BST = BST->Right;                else if(!BST -> Right)                    BST = BST->Left;            }        }    }    return BST;}
0 0
原创粉丝点击