搜索二叉树应用---判断单词正确与否,简单字典的实现,出现ip次数的统计

本文介绍如何使用二叉搜索树实现单词查找、字典及计数功能,并提供具体代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简单分析一下:
这是简单的key,value问题,简单称之为kv问题
1、判断一个单词是否正确
结构体构建:


typedef char* keyType;

typedef struct BSTreeNode
{
    struct BSTreeNode* _left;
    struct BSTreeNode* _right;
    keyType _key;

}BSTreeNode;

BSTreeNode* BSTreeBuyNode(keyType key)
{
    BSTreeNode* node=(BSTreeNode* )malloc(sizeof(BSTreeNode));
    node->_key=key;
    node->_left=NULL;
    node->_right=NULL;
    return node;
}

插入:

int BSTreeInsertR(BSTreeNode**pptree,keyType key)//插入
  {
      assert(pptree);
      if(NULL==*pptree)
      {
          *pptree=BSTreeBuyNode(key);
      }
      if(strcmp((*pptree)->_key,key)>0)//字符串比较
      return  BSTreeInsertR(&(*pptree)->_left,key);
      else if(strcmp((*pptree)->_key,key)<0)
       return BSTreeInsertR(&(*pptree)->_right,key);
      else
          return -1;//插入失败

  }

test.c

void test()
{ 
    BSTreeNode* tree = NULL; 
    BSTreeNode* ret;
    BSTreeInsertR(&tree, "tree"); 
    BSTreeInsertR(&tree, "binary"); 
    BSTreeInsertR(&tree, "return"); 
    BSTreeInsertR(&tree, "hash"); 
    BSTreeInsertR(&tree, "list"); 
    printf("%s\n ",BSTreeFindR(tree,"tree")->_key);
    printf("%s\n ",BSTreeFindR(tree,"binary")->_key);
    printf("%s\n",BSTreeFindR(tree,"return")->_key);
    printf("%s\n",BSTreeFindR(tree,"hash")->_key);
    printf("%s\n",BSTreeFindR(tree,"list")->_key);
    printf("%p\n",BSTreeFindR(tree,"tre"));

 }

这里写图片描述

2、字典的简单实现:
结构体构建:

#pragma once
typedef char* KeyType; 
typedef char* ValueType; 

typedef struct BSTreeNode 
{ 
    struct BSTreeNode* _left; 
    struct BSTreeNode* _right; 

     KeyType _key; 
    ValueType _value; 

}BSTreeNode; 

BSTreeNode* BuyBSTreeNode(KeyType key, ValueType value)
{
    BSTreeNode* node=(BSTreeNode* )malloc(sizeof(BSTreeNode));
    node->_key=key;
    node->_value=value;
    node->_left=NULL;
    node->_right=NULL;
    return node;
}

插入:

int BSTreeInsertR(BSTreeNode** pptree, KeyType key, ValueType value)//插入
  {
      assert(pptree);
      if(NULL==*pptree)
      {
          *pptree=BuyBSTreeNode(key,value);
      }
      if(strcmp((*pptree)->_key,key)>0)
      return  BSTreeInsertR(&(*pptree)->_left,key,value);
      else if(strcmp((*pptree)->_key,key)<0)
       return BSTreeInsertR(&(*pptree)->_right,key,value);
      else
          return -1;

  }

测试:

void TestBSTree() 
{ 
    BSTreeNode* tree = NULL; 

     BSTreeInsertR(&tree, "tree", "树"); 
     BSTreeInsertR(&tree, "sort", "排序"); 
     BSTreeInsertR(&tree, "binary", "二分"); 
     BSTreeInsertR(&tree, "return", "返回"); 
     BSTreeInsertR(&tree, "hash", "哈希"); 
     BSTreeInsertR(&tree, "list", "链表"); 

    printf("%s\n", BSTreeFindR(tree, "tree")->_value); 
    printf("%s\n", BSTreeFindR(tree, "return")->_value); 
    printf("%s\n", BSTreeFindR(tree, "hash")->_value); 
    printf("%s\n", BSTreeFindR(tree, "list")->_value); 
    printf("%p\n", BSTreeFindR(tree, "lis"));
}

这里写图片描述

3、结构体创建:

#pragma once
typedef char* KeyType; 
typedef int ValueType; 

typedef struct BSTreeNode 
{ 
    struct BSTreeNode* _left; 
    struct BSTreeNode* _right; 

     KeyType _key; 
    ValueType _value; //记录出现的次数

}BSTreeNode;
BSTreeNode* BuyBSTreeNode(KeyType key, ValueType value)//创建一个节点
{
    BSTreeNode* node=(BSTreeNode* )malloc(sizeof(BSTreeNode));
    node->_key=key;
    node->_value=0;
    node->_left=NULL;
    node->_right=NULL;
    return node;
}

2、插入:

 int BSTreeInsertR(BSTreeNode** pptree, KeyType key, ValueType value)//插入
  {
      assert(pptree);
      if(NULL==*pptree)
      {
          *pptree=BuyBSTreeNode(key,value);
          (*pptree)->_value++;//统计出现次数
          return 0;

      }
      if(strcmp((*pptree)->_key,key)>0)
      return  BSTreeInsertR(&(*pptree)->_left,key,value);
      else if(strcmp((*pptree)->_key,key)<0)
       return BSTreeInsertR(&(*pptree)->_right,key,value);
      else
      {
         (*pptree)->_value++;//统计出现次数
        return -1;
      }
      return 0;


  }

测试:

void TestBSTree() 
{ 
    BSTreeNode* tree=NULL;
    BSTreeNode* ret;
    BSTreeInsertR(&tree,"123.12.1",0);
    BSTreeInsertR(&tree,"124.34.2",0);
    BSTreeInsertR(&tree,"123.12.1",0);

    printf("%d\n",BSTreeFindR(&tree,"123.12.1")->_value);
    printf("%d\n",BSTreeFindR(&tree,"124.34.2")->_value);
    ret=BSTreeFindR(&tree,"124.34.0");
    if(ret==-1)
    {
        printf("没找到\n");
    }
    else
    {
        ret->_value;
    }
}

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值