C语言实现二叉查找树(BST)的基本操作

     我们在上一篇博客中讲解了二叉树,这一次我们来实现二叉树的进阶——二叉查找树(Binary Search Tree),又称二插排序树(Binary Sort Tree)。所以简称为BST。二插查找树的定义如下:

1.若左子树不为空,则左子树上所有节点的值均小于它的根节点的值;

2.若右子树不为空,则右子树上所有节点的值均大于它的根节点的值;

3.左右子树也分别为二叉排序树;

二叉排序树的一个重要特点就是中序遍历是一个递增序列。示例代码上传至: https://github.com/chenyufeng1991/BinarySearchTree  。


(1)节点的构造

typedef int elemType;
typedef struct BTNode{

    int data;
    struct BTNode *lChild;
    struct BTNode *rChild;
}BiTNode,*BiTree;


(2)创建二叉树

创建二插排序树的过程就是一个不断插入节点的过程,并且最重要的就是查找插入的合适位置。

//创建二叉查找树
/**
 *  输入-1时创建结束,其实是一个不断插入的过程
 */
int CreateBinarySearchTree(BiTree *T){

    printf("请输入创建二叉查找树的数字序列:\n");

    int num;
    scanf("%d",&num);

    while (num != -1) {
        Insert(T,num);
        scanf("%d",&num);
    }

    printf("%s函数执行,二叉查找树创建成功\n",__FUNCTION__);
    return 1;
}

(3)插入节点

//插入节点
void Insert(BiTree *T,int x){

    //这里创建一个要插入的节点
    BiTNode *pInsert = (BiTNode *)malloc(sizeof(BiTNode));
    pInsert->data = x;
    pInsert->lChild = NULL;
    pInsert->rChild = NULL;

    if ((*T) ==
  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
下面是用C语言实现二叉查找的代码示例: ```c #include <stdio.h> #include <stdlib.h> // 二叉查找树结构体 typedef struct BST { int val; struct BST *left; struct BST *right; } BST; // 创建新节点 BST* createNode(int val) { BST *node = (BST*)malloc(sizeof(BST)); node->val = val; node->left = NULL; node->right = NULL; return node; } // 插入节点 BST* insertNode(BST *root, int val) { if (root == NULL) { return createNode(val); } if (val < root->val) { root->left = insertNode(root->left, val); } else if (val > root->val) { root->right = insertNode(root->right, val); } return root; } // 查找节点 BST* searchNode(BST *root, int val) { if (root == NULL || root->val == val) { return root; } if (val < root->val) { return searchNode(root->left, val); } else { return searchNode(root->right, val); } } // 测试代码 int main() { BST *root = NULL; root = insertNode(root, 4); insertNode(root, 2); insertNode(root, 6); insertNode(root, 1); insertNode(root, 3); insertNode(root, 5); insertNode(root, 7); int val = 5; BST *node = searchNode(root, val); if (node != NULL) { printf("找到了值为%d的节点\n", val); } else { printf("没有找到值为%d的节点\n", val); } return 0; } ``` 在上面的代码中,我们先定义了一个二叉查找树结构体`BST`,包含一个整数`val`和两个指向左右子节点的指针`left`和`right`。然后我们定义了两个函数`createNode`和`insertNode`,分别用于创建新节点和将新节点插入到二叉查找树中。在`createNode`函数中,我们先动态分配内存,然后将节点的值赋值为传入的参数,左右子节点指针赋值为NULL。在`insertNode`函数中,我们首先判断二叉查找树是否为空,如果是则直接创建新节点。否则,判断要插入的节点值与当前节点值的大小关系,如果小于当前节点值,则递归插入到左子树中,否则插入到右子树中。最终返回根节点。 接下来,我们定义了一个`searchNode`函数用于查找节点。在函数中,我们先判断当前节点是否为空或者是否等于要查找的值,如果是则返回当前节点。否则,判断要查找的值与当前节点值的大小关系,如果小于当前节点值,则递归查找左子树,否则递归查找右子树。最终返回找到的节点或者NULL。 在`main`函数中,我们先创建一个空的二叉查找树,然后依次将数字4、2、6、1、3、5、7插入到二叉查找树中。最后,我们查找数字5是否在二叉查找树中,如果找到了则输出“找到了值为5的节点”,否则输出“没有找到值为5的节点”。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值