如何从字符串创建二进制搜索树?

时间:2019-05-26 17:00:34

标签: c binary-search-tree

我有以下任务:从字符串创建一个二进制搜索树,然后按字母顺序打印它们。 例如,

orange
melon
apple
grapes
plum
banana

应该有

apple
banana
grapes
melon
orange
plum

作为输出。我写了一个解决方案,但是我有一个问题:仅打印输入中的最后一个字符串(在本示例中为banana),并且在代码中找不到错误。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct Node {
    char *data;
    struct Node *left;
    struct Node *right;
} Node;
Node* getFreeNode(char *value) {
    Node* tmp = (Node*)malloc(sizeof(Node));
    tmp->left = tmp->right = NULL;
    tmp->data = value;
    return tmp;
}
void insert(Node **head, char *value) {
    Node* tmp = (Node*)malloc(sizeof(Node));
    tmp = *head;
    if (*head  == NULL) {
        *head = getFreeNode(value);
        return;
    }
    else{
        if (strcmp(value, tmp->data) > 0) {
            return insert(&(tmp->right), value);
        }
        else if (strcmp(value, tmp->data) < 0) {
            return insert(&(tmp->left), value);
        }
    }
}
void print_tree(Node *t)
{
    if (!t) return;
    print_tree(t->left);
    printf("%s\n", t->data);
    print_tree(t->right);
}
int main(){
    Node* a = NULL;
    FILE *in = fopen("input.txt", "r");
    freopen("output.txt", "w", stdout);
    char word[20];
    while (fscanf(in, "%s", word) == 1){
        insert(&a, word);
    }
    print_tree(a);
    return 0;
}

1 个答案:

答案 0 :(得分:1)

exports.handler = async (event, context, callback) => { console.log("Starting call: " + event.queryStringParameters.filter); console.log("Decoded param: " + decodeURIComponent(event.queryStringParameters.filter)); var filter = JSON.parse(decodeURIComponent(event.queryStringParameters.filter)); console.log("Filter: " + filter); var ingredients = filter.ingredients; var options = { uri: 'https://api.*****.com/search', qs: { app_id: '****', app_key: '*****', q: ingredients.join(' ') }, json: true }; console.log("Done calling stuff"); rp(options) .then(function(recipes) { console.log('Response: ' + recipes); var recipesToReturn = []; recipes.hits.forEach(function(recipeHit) { recipesToReturn.push(objectMapper(recipeHit.recipe, recipeMap)); }); console.log('Recipes:', recipesToReturn); const response = { statusCode: 200, body: JSON.stringify(recipesToReturn), }; return JSON.stringify(response); }) .catch(function(err) { console.log('Error:', err) const response = { statusCode: 400, body: err, }; return JSON.stringify(response); }); }; 中,您的代码正在插入main,这是一个本地堆栈变量。因此,每个节点的word成员都指向相同的地址。将data的内存地址插入树后,用文件的下一行覆盖word。同样,最终结果是,ever节点的word成员指向同一字符串-读入的最后一个字符串。

在将字符串插入树中之前,需要对其进行复制。修改您的getFreeNode函数,如下所示:

data

strdup复制该字符串。您可以通过在源文件顶部包括Node* getFreeNode(char *value) { Node* tmp = (Node*)malloc(sizeof(Node)); tmp->left = tmp->right = NULL; // tmp->data = value; tmp->data = strdup(value); // make a copy of the string for the new node return tmp; } 来使用它。否则,它与此相同:

#include <strings.h>

正如原始问题的评论部分所暗示的那样,这可能不是您唯一的错误。