字典树删除多余的结点疑问

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <string>
#include <iostream>
using namespace std;

struct node {
    int cnt;//记录个数;
    struct node *next[26];
    node()
    {
        cnt=0;
        memset(next,NULL,sizeof(next));
    }
};

void buildtrie(node *root,string s)//建树;
{
    node *p=root;
    node *tmp=NULL;
    int l=s.size();
    for(int i=0;i<l;i++)
    {
        if(p->next[s[i]-‘A‘]==NULL)
        {
            tmp=new node;
            p->next[s[i]-‘A‘]=tmp;
        }
        p=p->next[s[i]-‘A‘];
    }
    p->cnt++;
}

void findtrie(node *root ,string s)//查询
{
    node *p=root;
    int l=s.size();
    for(int i=0;i<l;i++)
    {
        p=p->next[s[i]-‘A‘];
    }
    printf("%d\n",p->cnt-1);
}

void del(node *root)//为什么root值永远为main函数传过来的值,递归的时候也是这个值,并且只执行一次,这是我调试的得到结果,但是删除结点代码就是这样,提交对了,但不知道为什么。调试也不懂,懂得可以给我讲下,///万分感谢
{
    for(int i=0;i<26;i++)
        if(root->next[i])
            del(root->next[i]);
    delete(root);
}

int main()
{
    int n;
    string s;
    node root;
    scanf("%d",&n);
    while(n--)
    {
        cin >> s;
        sort(s.begin(),s.end());
        buildtrie(&root,s);
        findtrie(&root,s);
        del(&root);
    }
    return 0;
}
时间: 2024-11-19 12:43:35

字典树删除多余的结点疑问的相关文章

Trie 字典树 删除操作

字典树的删除操作: 1 没找到直接返回 2 找到叶子节点的时候,叶子节点的count标志清零,代表不是叶子节点了 3 如果当前节点没有其他孩子节点的时候,可以删除这个节点 判断是否需是叶子节点,就检查叶子节点的count标志就可以了. 判断是否有其他孩子节点就需要循环26个节点了,如果都为空,那么就没有其他孩子节点了. #include <stdio.h> #include <stdlib.h> #include <iostream> #include <vect

Chip Factory HDU - 5536 字典树(删除节点|增加节点)

题意: t组样例,对于每一组样例第一行输入一个n,下面在输入n个数 你需要从这n个数里面找出来三个数(设为x,y,z),找出来(x+y)^z(同样也可以(y+z)^1)的最大值 (“^”代表异或操作,即“相同为0,不同为1”) 题解: 这一道题和Xor Sum HDU - 4825很相似 因为异或运算的特性,我们最后要求最大值,那我们就对这n个数的二进制形式建一颗字典树.然后就暴力枚举是哪两个数相加,然后在字典树中把这两个数删掉.然后在处理完的字典树中查找那个能使结果尽可能大的第三个数(至于怎么

逆序单词 HIhoCoder 1366 字典树

逆序单词 HIhoCoder 1366 字典序 题意 在英文中有很多逆序的单词,比如dog和god,evil和live等等. 现在给出一份包含N个单词的单词表,其中每个单词只出现一次,请你找出其中有多少对逆序单词. 第1行:1个整数,N,表示单词数量.2≤N≤50,000. 第2..N+1行:每行1个单词,只包含小写字母,每个单词长度不超过16个字母.保证每个单词只出现一次,且不会出现回文单词(即一个单词倒序还是它自己,比如eye). 输出第一行是个整数,表示单词表中的逆序单词的对数. 解题思路

trie树(字典树)

1. trie树,又名字典树,顾名思义,它是可以用来作字符串查找的数据结构,它的查找效率比散列表还要高. trie树的建树: 比如有字符串"ab" ,"adb","adc"   可以建立字典树如图: 树的根节点head不存储信息,它有26个next指针,分别对应着字符a,b,c等.插入字符串ab时,next['a'-'a']即next[0]为空,这是申请一个结点放在next[0]的位置,插入字符串db时,next['d'-'a']即next[3]

UVALive 7712 Confusing Manuscript 字典树 查询与s的编辑距离为1的字符串数量

/** 题目:UVALive 7712 Confusing Manuscript 链接:https://vjudge.net/problem/UVALive-7712 题意:给定n个不同的字符串,f(i)表示第i个字符串和其他字符串的编辑距离为1的个数. 编辑距离为1表示两个字符串其中一个可以通过删除任意位置某一个字符或者增加任意位置某一个字符或者替换任意位置某一个字符之后,两者匹配. 输出f(i)最大的字符串,如果f(i)==f(j) (i<j) 输出第i个字符串. 思路:字典树 主要是处理细

01字典树贪心查询+建立+删除(个人模版)

01字典树贪心查询+建立+删除: 1 #define maxn 2 2 typedef struct tree 3 { 4 tree *nex[maxn]; 5 int v; 6 int val; 7 }tree; 8 tree root; 9 void init() 10 { 11 for(int i=0;i<maxn;i++) 12 { 13 root.nex[i]=NULL; 14 } 15 } 16 void creat(char *str,int va) 17 { 18 int len

HDU 5687 字典树插入查找删除

题目:http://acm.hdu.edu.cn/showproblem.php?pid=5687 2016百度之星资格赛C题,直接套用字典树,顺便巩固了一下自己对字典树的理解 1 #include<stdio.h> 2 #include<string.h> 3 struct node{ 4 int next[27]; 5 int cnt; 6 void init(){ 7 cnt = 0;//计数 8 memset(next,-1,sizeof(next)); 9 } 10 };

Problem C (字典树的查找删除和插入)2016&quot;百度之星&quot; - 资格赛(Astar Round1)

Problem C Accepts: 630 Submissions: 5255 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Problem Description 度熊手上有一本神奇的字典,你可以在它里面做如下三个操作: 1.insert : 往神奇字典中插入一个单词 2.delete: 在神奇字典中删除所有前缀等于给定字符串的单词 3.search: 查询是否在神奇字典中

跳跃表,字典树(单词查找树,Trie树),后缀树,KMP算法,AC 自动机相关算法原理详细汇总

第一部分:跳跃表 本文将总结一种数据结构:跳跃表.前半部分跳跃表性质和操作的介绍直接摘自<让算法的效率跳起来--浅谈"跳跃表"的相关操作及其应用>上海市华东师范大学第二附属中学 魏冉.之后将附上跳跃表的源代码,以及本人对其的了解.难免有错误之处,希望指正,共同进步.谢谢. 跳跃表(Skip List)是1987年才诞生的一种崭新的数据结构,它在进行查找.插入.删除等操作时的期望时间复杂度均为O(logn),有着近乎替代平衡树的本领.而且最重要的一点,就是它的编程复杂度较同类