二叉搜索树的建立和搜索

二叉树

二叉搜索树的定义

  • 二叉树搜索树是基于二叉树和二分算法研究出来的一种特殊结构
  • 二叉树的左子树比根节点要小 右子树比根节点要大
    在这里插入图片描述

代码

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

typedef struct BstNode{
    int data;
    struct BstNode* left;
    struct BstNode* right;
}BstNode;
BstNode* Insert(BstNode* root,int data);
BstNode* GetNewNode(int data);
int Search(BstNode* root, int data);
int main()
{
    BstNode * Proot;  //The pointer is point to root node of Tree
    Proot = NULL;     //setting Tree as empty
    Proot = Insert(Proot,15);
    Proot = Insert(Proot,10);
    Proot = Insert(Proot,20);
    Proot = Insert(Proot,25);
    Proot = Insert(Proot,8);
    Proot = Insert(Proot,12);
    int number;
    printf("Enter number be searched\n");
    scanf("%d",&number);
    if(Search(Proot, number) == 1) printf("Found\n");
    else printf("Not Found\n");
    return 0;
}

BstNode* GetNewNode(int data)
{
    BstNode* newNode = (BstNode*)malloc(sizeof(BstNode));
    (*newNode).data = data;
    newNode->left = NULL;
    newNode->right = NULL;
    return newNode;
}
BstNode* Insert(BstNode* root,int data)
{
    if( root == NULL){
        root = GetNewNode(data);
    }else if( data <= root->data){
        root->left = Insert(root->left, data);
    }else {
        root->right = Insert(root->right ,data);
    }
    return root;
}
int Search(BstNode* root, int data)
{
      if(root == NULL) return 0; //0代表树空
      else if(root->data == data) return 1;
      else if( data <= root->data) return Search(root->left, data);
      else return Search(root->right, data);
      
}
int FindMin(BstNode* root)
{
    if(root == NULL) return root->data;
    else{
        root = root->left;
        return FindMin(root);
    }
}

核心代码

BstNode* GetNewNode(int data)
{
    BstNode* newNode = (BstNode*)malloc(sizeof(BstNode));  //申请一个Bstnode结构的变量 将指针指向这个变量
    (*newNode).data = data;  // 将数据给到结点
    newNode->left = NULL;  //子树指针为空
    newNode->right = NULL;
    return newNode;    //返回指针
}
BstNode* Insert(BstNode* root,int data)
{
    if( root == NULL){  //查看根节点是否为空  如果空就这这个指针指向一个新的结点
        root = GetNewNode(data);  
    }else if( data <= root->data){  //如果数据比结点小  将结点插入到左子树
        root->left = Insert(root->left, data);
    }else {
        root->right = Insert(root->right ,data); //否者数据比结点大  将结点插入到右子树
    }
    return root;
}

运行结果

在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值