Deep clone and recursive merge for a binary tree in C
C
#define _POSIX_C_SOURCE 200809L
#include <stdlib.h>
#include <string.h>
typedef struct T { char *key, *val; struct T *left, *right; } T;
T *clone(const T *t) {
if (!t) return NULL;
T *c = malloc(sizeof *c); if (!c) return NULL;
c->key = t->key ? strdup(t->key) : NULL;
c->val = t->val ? strdup(t->val) : NULL;
c->left = clone(t->left);
c->right = clone(t->right);
return c;
}
T *merge(T *a, const T *b) {
if (!b) return a;
if (!a) return clone(b);
int c = strcmp(a->key, b->key);
if (c == 0) { free(a->val); a->val = b->val ? strdup(b->val) : NULL; }
else if (c < 0) a->left = merge(a->left, b);
else a->right = merge(a->right, b);
return a;
}