美文网首页
c语言实现二叉查找树

c语言实现二叉查找树

作者: 一路向后 | 来源:发表于2022-01-30 21:36 被阅读0次

1.源码实现

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define true 1
#define false 0

typedef int ElemType;
typedef int KeyType;

/*二叉查找树的节点结构定义*/
typedef struct BiTNode {
    int data;
    struct BiTNode *lchild, *rchild;
} BiTNode, *BiTree;

/*二叉查找树查找算法*/
int SearchBST(BiTree T, KeyType key, BiTree f, BiTree *p)
{
    /*如果T指针为空, 说明查找失败*/
    if(!T)
    {
        *p = f;
        return false;
    }
    /*如果相等, 令p指针指向该关键字*/
    else if(key == T->data)
    {
        *p = T;
        return true;
    }
    /*如果key值比T根节点的值小, 则查找其左子树; 反之, 查找其右子树*/
    else if(key < T->data)
    {
        return SearchBST(T->lchild, key, T, p);
    }
    else
    {
        return SearchBST(T->rchild, key, T, p);
    }
}

int InsertBST(BiTree *T, ElemType e)
{
    BiTree p = NULL;

    /*如果查找不成功, 需做插入操作*/
    if(!SearchBST((*T), e, NULL, &p))
    {
        /*初始化插入节点*/
        BiTree s = (BiTree)malloc(sizeof(BiTNode));

        s->data = e;
        s->lchild = s->rchild = NULL;

        /*如果p为null, 说明该二叉树为空树, 此时插入的结点为整棵树的根节点*/
        if(!p)
        {
            *T = s;
        }
        /*如果p不为NULL, 则p指向的为查找失败的最后一个子节点*/
        else if(e < p->data)
        {
            p->lchild = s;
        }
        else
        {
            p->rchild = s;
        }

        return true;
    }

    return false;
}

int Delete(BiTree *p)
{
    BiTree q, s;

    /*情况1, 结点p本身为叶子结点, 直接删除即可*/
    if(!(*p)->lchild && !(*p)->rchild)
    {
        q = *p;
        free(q);
        *p = NULL;
    }
    /*情况2, 左子树为空, 只需用结点p的右子树根节点代替结点p即可*/
    else if(!(*p)->lchild)
    {
        q = *p;
        *p = (*p)->rchild;
        free(q);
    }
    /*情况3, 右子树为空, 只需用结点p的左子树根节点代替结点p即可*/
    else if(!(*p)->rchild)
    {
        q = *p;
        *p = (*p)->lchild;
        free(q);
    }
    /*情况4, 左右子树均不为空*/
    else
    {
        q = *p;
        s = (*p)->lchild;

        /*遍历, 找到结点p的前驱*/
        while(s->rchild)
        {
            q = s;
            s = s->rchild;
        }

        /*直接改变结点p的值*/
        (*p)->data = s->data;

        /*判断结点p的左子树s是否有右子树*/
        if(q != *p)
        {
            /*若有, 则在删除直接前驱结点的同时, 令前驱的左孩子结点改为q指向结点孩子的结点*/
            q->rchild = s->lchild;
        }
        else
        {
            /*若无, 则直接将左子树上移即可*/
            q->lchild = s->lchild;
        }

        free(s);
    }

    return true;
}

int DeleteBST(BiTree *T, int key)
{
    /*不存在关键字等于key的数据元素*/
    if(!(*T))
    {
        return false;
    }
    else
    {
        if(key == (*T)->data)
        {
            Delete(T);
            return true;
        }
        else if(key < (*T)->data)
        {
            /*使用递归的方式*/
            return DeleteBST(&(*T)->lchild, key);
        }
        else
        {
            return DeleteBST(&(*T)->rchild, key);
        }
    }
}

/*中序输出*/
void order(BiTree t)
{
    if(t == NULL)
    {
        return;
    }

    order(t->lchild);
    printf("%d ", t->data);
    order(t->rchild);
}

int main()
{
    int i;
    int a[5] = {3, 4, 2, 5, 9};
    BiTree T = NULL;

    for(i=0; i<5; i++)
    {
        InsertBST(&T, a[i]);
    }

    printf("中序遍历二叉树\n");
    order(T);
    printf("\n");
    printf("删除3之后, 中序遍历二叉树\n");
    DeleteBST(&T, 9);
    order(T);
    printf("\n");

    return 0;
}

2.编译源码

$ gcc -o test test.c -std=c99

3.运行及其结果

$ ./test
中序遍历二叉树
2 3 4 5 9 
删除3之后, 中序遍历二叉树
2 3 4 5 

相关文章

  • 二叉树 堆 2019-04-17

    二叉树 实现一个二叉查找树,并且支持插入、删除、查找操作 实现查找二叉查找树中某个节点的后继、前驱节点 实现二叉树...

  • 二叉查找树C语言实现

    二叉查找树C语言实现 二叉查找树是一种特殊的树,它的左子树的所有值均小于它本身,它的右子树的值均大于它本身,从而达...

  • 7天练|Day5:二叉树和堆

    关于二叉树和堆的7个必知必会的代码实现二叉树实现一个二叉查找树,并且支持插入、删除、查找操作实现查找二叉查找树中某...

  • 二叉排序树BST

    二叉排序树/二叉查找树/二叉搜索树BST set和map的实现基础查找 插入 不使用引用C中没有引用对父节点的le...

  • 二叉查找树

    1)二叉查找树是什么?2)二叉查找树的插入、删除、查找?3)Go代码实现 一、二叉查找树是什么?二叉查找树(BST...

  • 二叉查找树的查找和排序方法的实现

    定义二叉树 二叉查找树的查找和排序方法的实现

  • 6. 二叉树创建-查找

    1. 递归方式实现二叉树的构建2. 树、二叉树、二叉查找树3. 二叉树排序树的理解4. 二叉查找树5. 二叉树的查找

  • 算法与数据结构系列之[二叉树-中]

    上篇介绍了二叉树的理论部分,这篇贴出二叉树完整的C语言代码实现。 BinaryTree.c BinaryTree....

  • 算法与数据结构系列之[二叉树-下]

    上篇贴出了二叉树的C语言代码实现,这篇贴出Java代码实现。

  • c语言实现二叉查找树

    1.源码实现 2.编译源码 3.运行及其结果

网友评论

      本文标题:c语言实现二叉查找树

      本文链接:https://www.haomeiwen.com/subject/zhlckrtx.html