二叉查找树

二叉查找树,树中每个结点X,它的左子树中所有关键字值小于X的关键字值,而它的右子树种所有关键字值大于X的关键字值。

代码如下:

typedef struct TreeNode *SearchTree;
typedef struct TreeNode *Position;
typedef int ElementType;

struct TreeNode
{
    ElementType element;
    SearchTree left;
    SearchTree right;
};

对于树的操作中,最复杂的要数删除操作,具体分三种情况:1.要删除的结点是叶子节点;2要删除的结点有1个儿子;3.要删除的结点有2个儿子。具体实现看代码:

Position Find(ElementType X,SearchTree T)
{
    if(T==NULL)
        return T;
    if(X<T->element)
        return Find(X,T->left);//通过层层return,最终得到的返回值就是被找到的那个元素结点。
    else if(X>T->element)
        return Find(X,T->right);
    else
        return T;
}
Position FindMin(SearchTree T)
{
    if(T==NULL || T->left==NULL)
        return T;        
    else 
        return FindMin(T->left);//往左找到底
}
Position FindMax(SearchTree T)
{
    if(T==NULL || T->right==NULL)
        return T;
    else 
        return FindMax(T->right);//往右找到底
}
SearchTree Insert(ElementType X,SearchTree T)
{
    if(T==NULL)//找到没办法往下找的时候,就在这个地方插入值
    {
        T = (SearchTree)malloc(sizeof(struct TreeNode));
        if(T == NULL)
        {
            printf("out of place");
        }
        else
        {
            T->element = X;
            T->left = NULL;
            T->right = NULL;
        }
    }
        
    else if(X<T->element)
        T->left = Insert(X,T->left);//将插入的结点跟父节点关联起来
    else if(X>T->element)
        T->right = Insert(X,T->right);
    return T;
}
SearchTree Delete(ElementType X,SearchTree T)
{
    Position tmp;
    if(T == NULL)
        printf("element is not found!");
    else if(X < T->element)
        T->left = Delete(X,T->left);
    else if(X > T->element)
        T->right = Delete(X,T->right);
    else//走到这一步说明当前这个T就是我们要删除的那个结点
    {
        if(T->left&&T->right)//两个儿子,找右子数中最小的数,它肯定比左子树的所有数都大,又比右子数的所有数都小。或者找左子树的最大值,意思是一样的。
        {
            tmp = FindMin(T->right);
            T->element = tmp->element;//将找到的右子数最小值放在T中,然后删除那个最小值得结点。
            T->right = Delete(T->element,T->right);
        }
        else//如果没儿子或者有1个儿子
        {
            tmp = T;
            if(T->left == NULL)//处理了只有右儿子或没儿子的情况
                T = T->right;
            else if(T->right == NULL)//处理只有左儿子的情况
                T = T->left;
            free(tmp);
        }
    }
    return T;
}

 

posted @ 2016-08-13 23:55  九杯水  阅读(93)  评论(0)    收藏  举报