Cで木構造をつくるにあたって,

//ノード
struct tnode
{
    struct tnode *left;
    char *value;
    struct tnode *right;
};

struct tnode *talloc(void)
{
    return (struct tnode *)malloc(sizeof(struct tnode));
}

struct tnode *gentree(struct tnode *p, char *w)
{
    if(p==NULL)
    {
        //端に来たら生成
        p=talloc();
        strcpy(p->value, w);
        p->left = p->right = NULL;
    }
    else
    {
        //端じゃないなら左右にNULLまで走査
        p->left  = gentree(p->left, w);
        p->right = gentree(p->right, w);
    }
    return p;
}

void main()
{
    struct tnode *root;
    root = NULL;

    root=gentree(root, "aaa");
    printf("%s\n", root->value);
    putchar('\n');

    root=gentree(root, "bbb");
    printf("%s\n", root->value);
    printf("%s\n", root->left->value);
    printf("%s\n", root->right->value);
}

このようにして作成しようとしてます.
木の構造としては,aaaが2つのbbbに分岐してほしいのですが,実行結果は

aaa

bbb //aaaであってほしい
bbb
bbb

と,どこかでaaaがbbbに書き換えられてしまいます.試しに以下のように書き換えアドレスを確認したところ,2つのアドレスは同じでした.

root=gentree(root, "aaa");
printf("%d\n", root);

root=gentree(root, "bbb");
printf("%d\n", root);

初歩的なことかもしれませんが,どうかご回答お願いいたします.