C构建字符串作为递归遍历二叉树

时间:2016-03-13 08:24:01

标签: c string recursion binary-tree

我有以下情况我需要在二叉树中添加一个元素,一旦满足添加它的条件,我还返回一个字符串,它是树中我添加元素的位置的二进制表示

然后使用格式" 001101"和" 0"意思是左,而" 1"意思是对的。 E.g:

在以下位置的树中添加元素C:

        A
       /
      /
     B
      \
       \
        \
    <ADD HERE>

...将返回&#34; 01&#34;字符串。

随着这棵树的增长,我们会有像#00; 00000111101&#34;甚至更大。添加此元素的方法具有递归行为,因为它遍历左/右子指针并在向下进入树时构建此二进制字符串。

我的问题是,我如何递归地构建这个字符串?

ATTEMPT 1:我已经修改了方法签名:

void tree_insert(node **tree, node **parent, unsigned char val);

要:

void tree_insert(node **tree, node **parent, unsigned char val, char *position);

然后调用方法发送一个初始的空字符串&#34;&#34;按照以下方式:

tree_insert(tree, NULL, val, "");

然后遍历:

if ((*tree)->left != NULL)
    tree_insert(&(*tree)->left, &(*tree), val, strcat(position, "0"));
if ((*tree)->right != NULL)
    tree_insert(&(*tree)->right, &(*tree), val, strcat(position, "1"));

但它没有用。

感谢任何帮助。

谢谢!

1 个答案:

答案 0 :(得分:0)

修改字符串文字具有未定义的行为。不幸的是,你想要做的并不是在标准C中有效地做到这一点。我会为C做一个缓冲处理解决方案,有类似的东西:

struct stringbuffer {
    size_t allocated;
    size_t length;
    char *string;
};

void init_buffer(struct stringbuffer *b) {
     b->allocated = 16;
     b->length = 0;
     b->string = malloc(16);
}

void append_char(struct stringbuffer *b, char c) {
    if (b->length + 2 > b->allocated) {
        b->string = realloc(b->string, b->allocated * 2);
    }
    b->string[b->length ++] = c;
    b->string[b->length] = 0;
}

然后:

struct stringbuffer buffer;
init_buffer(buffer);

recursive_algorithm(&buffer);
... 
append_char(b, '0')
append_char(b, '1')

但是,如果您足够幸运地使用 POSIX ,那么您可以使用open_memstream创建FILE *,甚至可以fprintf:< / p>

#include <stdio.h>
#include <stdlib.h>

int main() {
    char *buffer;
    size_t size;
    FILE *f = open_memstream(&buffer, &size);
    fprintf(f, "0");
    fputc('1', f);
    fclose(f);
    buffer[size] = 0;
    puts(buffer);
}