我正在尝试以递归方式遍历树并在递归中携带字符串。
这个想法是(对于霍夫曼编码),从根开始,如果你向左,将0连接到你的字符串,如果你向右,连接1.当你到达一个叶子,你的最后一个字符串是一个字符串0和1是你的“编码”。
这是我的功能:
void encode_tree(bin_node *root, char *string)
{
if(root->left==NULL && root->right==NULL)
{
root->encoding = string;
printf("%d got an encoding of %s\n", root->data, root->encoding);
return;
}
root->encoding = string;
encode_tree(root->left, strcat(string, "0"));
encode_tree(root->right, strcat(string, "1"));
}
但是这段代码错了,它给了我错误的编码。
假设我有这棵树:
3\65
6\-1
3\70
9\-1
2\66
3\-1
1\67
16\-1
7\68
我对7/86的编码应为0,1 / 67应为100,2 / 66应为101,3 / 70应为110,3 / 65应为111。
但这是我从我的功能中得到的编码:
7/68 got an encoding of 0
1/67 got an encoding of 0100
2/66 got an encoding of 01001
3/70 got an encoding of 0100110
3/65 got an encoding of 01001101
答案 0 :(得分:2)
这里的问题是你只有只分配了一个唯一的字符串,并且你试图给每个元素赋予自己独特的编码。这不起作用,因为在它结束时,它们都指的是相同的字符串。
您需要使用strdup
或分配新字符串,并在每次要将其分配到string
时从bin_node::encoding
复制
更改
root->encoding = string;
要 SetEncoding(root,string);
,其中
void SetEncoding(bin_node* n, char* e)
{
char *d = malloc (strlen (e) + 1); // Space for length plus nul
if (d == NULL) return NULL; // No memory
strcpy (d,s); // Copy the characters
n->encoding = d;
}
答案 1 :(得分:0)
strcat具有将字符附加到字符串末尾的效果,但是从末尾删除字符的代码在哪里?请注意,在下面的示例中,“1”值将替换“0”值。你的代码不是这样;您的代码附加'0',然后在'0'后附加'1'。
// usage: encode_tree(root, string, string);
void encode_tree(bin_node *root, char *string, char *end)
{
if(root->left==NULL && root->right==NULL)
{
*end = '\0';
printf("%d got an encoding of %s\n", root->data, root->encoding);
return;
}
root->encoding = string;
*end = '0'; encode_tree(root->left, string, end + 1);
*end = '1'; encode_tree(root->right, string, end + 1);
}