在c中创建具有静态和预定元素的树

迭戈·席尔瓦

我有一个问题,我决定使用二叉树来解决,但是:

我想不出用预先确定的元素填充树的方法,使其在图像中看起来像下面在此处输入图像描述我使用如下矢量,然后我将它插入到树中,我不知道我是否只是离开它按照图像中树的顺序组装,但我所做的是以下内容:

char* dict[] = {
    "Mamifero","aves","repteis",
    "quadrupede", "bipede", "voadores", "aquaticos",
    "nao-voadoras", "nadadoras", "de rapina", "com casco", "carnivoros", "sem patas",
    "carnivoro", "herbivoro", "onivoro", "afrutifero", "tropical", "polar", 
    "leao", "cavalo", "homem", "macaco", "morcego", "baleia", "avestruz", "pinguim", 
    "pato", "aguia", "tartaruga", "crocodilo", "cobra"
};

typedef struct Animal *animalptr;

typedef struct Animal {
    char *str;
    animalptr left, right;
} Animal;

typedef int (*compare)(const char*, const char*);


void insert (char* key, Animal** leaf, compare cmp) {
    int res;
    if (*leaf == NULL) { 
        *leaf = (Animal*) malloc(sizeof(Animal));
        (*leaf)->str = malloc(strlen(key) + 1);
        strcpy ((*leaf)->str, key);

        (*leaf)->left = NULL; 
        (*leaf)->right = NULL;

        // printf("\nnew node for %s", key); 
    } 
    else {
        // printf("%d\n", res);
        res = cmp (key, (*leaf)->str);
        if (res < 0) insert (key, &(*leaf)->left, cmp);
        else if (res > 0) insert (key, &(*leaf)->right, cmp);
        else printf("key '%s' already in tree\n", key);

    } 
}

int cmpStr (const char* a, const char* b) {
    // printf("a = %d\n b = %d", strlen(a), strlen(b));
    return (strcmp (a,b));
}

填写如下:

int main () {
    Animal *parent = NULL;
    char q;   
    // printf("%ld\n", sizeof(dict));
    // insert(dict[0], &parent, (compare)cmpStr);
    // printTree(parent);
    for (int i = 0;  i < NUM_NODES; i++) {
        insert(dict[i], &parent, (compare)cmpStr);
    }

    printf ("%s", search(parent, "", (compare)cmpStr)->str);


    // printTree(parent);
    // do {
    // //     scanf("%c", &q);
    // //     printf("%s?", dict[rand() % 32]); 
    // // }while (q != 'q');

    return 0;
}

所以现在我的传奇将是如何对每个单词施加一些权重,将其指向一侧或另一侧,我试图以这种方式解决的练习是这样的:

建立一个程序,该程序能够通过问题和答案得出以下哪些动物被选中的结论。可能的动物:狮子、马、人、猴子、鲸鱼、鸵鸟、企鹅、鸭子、鹰、乌龟、鳄鱼和蛇。

在此处输入图像描述测试

敦吉士

每个词都可以标注一个父子关系,权重=父权重+同父权下自己的序号,比如

  • 马米菲罗 => "1"
  • aves => "2"
  • 重复=>“3”
  • bipede => “12”(Mamifero 下的第二个孩子)
  • afrutifero => “122”(双足下的第二个孩子)

如果前缀相同,则表示有父子关系,插入树的右侧,否则插入树的左侧

请看修改后的代码

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    typedef struct words {
        char *weight;
        char *name;
    } Words;
    
    Words dict[] = {
        {"1", "Mamifero"},
        {"2", "aves"},
        {"3", "repteis"},
        {"11", "quadrupede"},
        {"12", "bipede"},
        {"13", "voadores"},
        {"14", "aquaticos"},
        {"21", "nao-voadoras"},
        {"22", "nadadoras"},
        {"23", "de rapina"},
        {"31", "com casco"},
        {"32", "carnivoros"},
        {"33", "sem patas"},
        {"111", "carnivoro"},
        {"112", "herbivoro"},
        {"121", "onivoro"},
        {"122", "afrutifero"},
        {"211", "tropical"},
        {"212", "polar"},
        {"1111", "leao"},
        {"1121", "cavalo"},
        {"1211", "homem"},
        {"1221", "macaco"},
        {"131", "morcego"},
        {"141", "baleia"},
        {"2111", "avestruz"},
        {"2121", "pinguim"},
        {"221", "pato"},
        {"231", "aguia"},
        {"311", "tartaruga"},
        {"321", "crocodilo"},
        {"331", "cobra"}
    };
    
    #define NUM_NODES (sizeof(dict)/sizeof(*dict))
    
    typedef struct Animal *animalptr;
    
    typedef struct Animal {
        char *weight;
        char *str;
        animalptr left, right;
    } Animal;
    
    typedef int (*compare)(const char *, const char *);
    
    void insert(Words *key, Animal **leaf, compare cmp)
    {
        int res;
        if (*leaf == NULL) {
            *leaf = (Animal *) malloc(sizeof(Animal));
            (*leaf)->str = strdup(key->name);
            (*leaf)->weight = strdup(key->weight);
    
            (*leaf)->left = NULL;
            (*leaf)->right = NULL;
        } else {
            res = cmp(key->weight, (*leaf)->weight);
            if (res < 0) insert(key, &(*leaf)->left, cmp);
            else if (res > 0) insert(key, &(*leaf)->right, cmp);
            else printf("key '%s' already in tree\n", key->name);
        }
    }
    
    int cmpStr(const char *a, const char *b)
    {
        if (strcmp(a, b) == 0)
            return 0;
        // If the prefixes are the same, it means a is a child of b, insert on the right
        if (strncmp(a, b, strlen(b)) == 0)
            return 1;
        // Otherwise insert left
        return -1;
    }
    
    char *search(Animal *leaf)
    {
        char *ret = "";
        char buf[16];
    
        while (leaf) {
            if (!leaf->right && !leaf->left) {
                ret = leaf->str;
                break;
            }
    
            // guess
            printf("É %s (yes,no): ", leaf->str);
            fgets(buf, sizeof(buf), stdin);
            if ((*buf == 'q') || (*buf == 'Q'))
                break;
    
            // If yes, go to the right
            if ((*buf == 'y') || (*buf == 'Y'))
                leaf = leaf->right;
            // Otherwise, left
            else if ((*buf == 'n') || (*buf == 'N'))
                leaf = leaf->left;
        }
    
        return ret;
    }
    
    int main()
    {
        Animal *parent = NULL;
    
        for (int i = 0;  i < NUM_NODES; i++) {
            insert(&dict[i], &parent, (compare)cmpStr);
        }
    
        printf("%s\n", search(parent));
        return 0;
    }
    

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何将Qt中的组合框元素与具有相同索引的静态向量中的预定义元素链接?

如何创建具有预定范数和均值的数组?

在C ++中创建具有相同元素多次重复的数组

C++ 中是否有任何预定义函数可以从给定数组中查找最小和最大元素?

如何创建具有预定义值和分配空间的字符串?

PHP创建具有预定义列和宽度的字符串

二叉树垂直顺序遍历中具有相同水平高度和相同垂直高度的元素的问题

具有CSS中预定义高度的主体元素的背景颜色

使用mapply和rank创建具有R的列表中每个元素的排名列

如何创建Cookie(具有静态值)以将其添加到C#的.Net 4.5中的CookieContainer中

PHP:基于单元和具有大于1个元素的concat顺序单元中的元素数创建新数组

如何创建具有多个键和元素的单个对象?

C#在具有现有大小的数组中添加和删除元素

创建具有预定长度的数组的ArrayList

Azure 创建具有预定值的客户端密钥

Python:创建具有预定长度的元组

对具有不同条件的树集中的元素进行排序和区分

一种更快的(矢量化)方式来创建具有预定长度的1和0的滑动序列

如何在 C# 中构建结构列表数组(具有预定义的数组大小)

C ++中具有静态成员的类的编译错误

c中具有分配值的枚举的静态查找表

具有预定义宏且与字符串连接的Printf在C中具有格式说明符

C# - 如何删除具有命名空间的 XMLDocument 中的声明和元素?

在同一个类中具有静态和非静态方法是否错误?

如何创建具有静态宽度的DIV

如何使用列表中的元素构造具有特定形状的树

元素树python中具有属性的xpath表达式

在 numpy 中创建一个正态分布矩阵,每个元素具有指定的均值和方差

如何在JGraphX中创建具有可折叠节点的层次树