当前位置: 首页 > 知识库问答 >
问题:

如何从字符串创建二叉查找树?

蓝宜
2023-03-14

我试图创建一个莫尔斯编码器-解码器,我必须使用二进制搜索树(而不是数组)。下面的部分假定获取一个字符数组(我们之前从一个文本文件创建了这个数组),并基于它创建一个搜索树

在btree|u基本字符数组中,我们有以下格式的数据:“(字母)(摩尔斯电码)|(字母)(摩尔斯电码)|”等(例如e.| t-| z-|…)。

注意:字符串包含数据的方式是,通过从头到尾读取数据,将创建一个平衡的搜索树

二叉树的创建没有成功,我知道,因为当我运行代码时,btree_print函数不会在控制台上打印任何内容,我发现这是因为向它传递了一个空指针。

我的问题是为什么会这样,以及如何解决这个问题?我是弄乱了指针,还是在传递根指针时需要使用双重间接寻址?我真的不懂**指针,所以我试着避开它们。

typedef struct BinTree{
    char letter;
    char code[6];
    struct BinTree *left, *right;
} BTree;

BTree* add(BTree* root, char ch, char* code, int length){
    int i;
    char a;
    if (root == NULL) {
        BTree *new = (BTree*) malloc(sizeof(BTree));
        new->left = new->right = NULL;
        new->letter = ch;
        for(i=0; i<length; i++) new->code[i] = code[i];
        new->code[length] = '\0';
        return new;
    }

    a=root->letter;

    if (ch < a) root->left = add(root->left, ch, code, length);
    else if (ch > a) root->right = add(root->right, ch, code, length);

    return root;
}

void build(BTree* root, char* c, int length){
    int i, size=-1;
    char b, k[6];
    for(i=0; i<length; i++){
        if(size==-1) b=c[i];
        if(c[i]==' ') size=0;
        if(size!=-1 && c[i]!='|'){
            k[size]=c[i];
            size++;
        }
        if(c[i]=='|'){
            k[size]='\0';
            root=add(root, b, k, size);
            size=-1;
        }
    }
}

void btree_print(BTree* root){
    if(root == NULL) return;

    printf("%c %s\n",root->letter,root->code);
    btree_print(root->left);
    btree_print(root->right);
}

void btree_del(BTree* root){
    if(root==NULL) return;

    btree_del(root->left);
    btree_del(root->right);
    free(gyoker);
}

int main(){
    char btree_base[238];
    BTree* bin_root = NULL;

    build(bin_root, btree_base, 238);

    btree_print(bin_root);

    btree_del(bin_root);
    return 0;
}

共有1个答案

阎冠玉
2023-03-14

因为您要通过值将根节点传递给build,所以对其值所做的任何更改都不会反映到调用函数中。因此,正如您所猜测的,您需要传递一个指向根的指针,这将使它成为一个b树**

build(&bin_root, btree_base, 238);

然后在build内部,当你想访问根节点时,你必须先用*前缀来解除对根节点的引用,如下所示:

*root=add(*root, b, k, size);

add也可以从这样的工作中受益,而不是返回更新的节点。因为build已经有一个BTree**意味着你只需要像这样传入root

add(root, b, k, size);

 类似资料:
  • 问题内容: 我正在尝试将String传递给我的。如何通过针对读者的“测试” 而不是来自读者的输入? 问题答案: 您可以如下修改代码

  • 问题内容: 我正在遵循指南,它为我提供了以下代码: 我想知道的是如何仍然可以创建一个,但是不要读取文件的内容,而要使用一个已有的变量。 问题答案: 使用而不是。 请参阅StringReader的文档 例:

  • 问题内容: 我不习惯在Java中使用流-如何从中创建流? 问题答案: 干得好: 更新 对于多字节支持使用(感谢 Aaron Waibel 的评论): 请参阅ByteArrayInputStream手册。 在上面的String#getBytes(charset)方法中使用charset参数是安全的。 在JDK 7+之后,您可以使用 而不是硬编码的编码字符串:

  • 本文向大家介绍如何从Java ArrayList创建字符串?,包括了如何从Java ArrayList创建字符串?的使用技巧和注意事项,需要的朋友参考一下 要将ArrayList的内容转换为String,创建一个StringBuffer对象,将ArrayList的内容附加到该对象,最后使用toString()方法将StringBuffer对象转换为String 。 示例 输出结果

  • 问题内容: 我有一个字符串形式: 依此类推(长度会有所不同)。由此创建字典的最简单方法是什么? 我知道我可以拆分,但是我无法获得正确的语法。如果我分开,那么我如何将这两个部分结合在一起? 对此进行迭代似乎很痛苦。 问题答案: 编辑:下一个解决方案是当您想要将值作为整数,我认为这是您想要的。

  • 问题内容: 这是一个非常基本的问题。但是我无法在Java文档中找到答案,也无法对其进行测试,因为我不知道这种方法是否存在。 我可能会收到一个URL字符串,可能是 要么 然后我会得到可能以开头的资源路径,或者就像 我正在看课,可以处理第一部分,即获取hostURL使其成为HTTPS或HTTP请求。问题是附加资源路径。我必须手动检查它的第一个字母是否存在。我想知道此功能是否已经在某个类中。 问题答案: