Phone List --字典树

本文介绍了一个使用C++实现的字典树(Trie)数据结构,并详细解释了如何通过合理分配内存来避免运行错误和内存泄漏的问题。作者分享了在编程过程中遇到的关于new和delete操作符使用的误区,并提供了完整的代码示例。

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

题目

刚开始定义node 变量,之后删除时出现run error ,之后问了别人, 知道 delete 只能删除堆的内存,所以定义了node *root=new node ,AC了。

:new 和delete 只能用堆里的内存 即new 的内存

再就是注意建完一次树之后就删了建的树。要不内存超出。。。

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
bool flag;
typedef struct node {
     int cnt;
     struct node *next[10];
     node()
     {
          memset(next,NULL,sizeof(next));
          cnt=0;
     }
}node ;
char s[20];

void buildtrid(node *root)
{
     node *p=root;
     int l=strlen(s);
     node *tmp;
     for(int i=0;i<l;i++)
     {
          if(p->next[s[i]-'0']==NULL)
          {
               tmp=new node;
               p->next[s[i]-'0']=tmp;
          }
          p=p->next[s[i]-'0'];
          if(p->cnt!=0)
               flag=false;
     }
     for(int i=0;i<10;i++)
          if(p->next[i]!=NULL)
          {
               flag=false;
               break;
          }
     p->cnt++;
}
void del(node *root)
{
     for(int i=0;i<10;i++)
     {
          if(root->next[i])
               del(root->next[i]);
     }
     delete root;
}
int main()
{
     int n,m;
     scanf("%d",&n);
     while(n--)
     {
          flag=true;
          node *root=new node;
          scanf("%d",&m);
          while(m--)
          {
               scanf("%s",s);
               if(!flag)continue;
               buildtrid(root);
          }
          if(flag)
               printf("YES\n");
          else
               printf("NO\n");
          del(root);
     }
     return 0;
}

 

转载于:https://www.cnblogs.com/WDKER/p/5501351.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值