我有以下情况我需要在二叉树中添加一个元素,一旦满足添加它的条件,我还返回一个字符串,它是树中我添加元素的位置的二进制表示
然后使用格式" 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"));
但它没有用。
感谢任何帮助。
谢谢!
答案 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);
}