使用字符串递归遍历树

时间:2013-02-25 01:35:01

标签: c string pointers recursion

我正在尝试以递归方式遍历树并在递归中携带字符串。

这个想法是(对于霍夫曼编码),从根开始,如果你向左,将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

2 个答案:

答案 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);

}