Deep clone and recursive merge for owned trees

C++
#include <map>
#include <memory>
#include <string>

struct Node {
    std::map<std::string, std::string> fields;
    std::map<std::string, std::unique_ptr<Node>> children;
};
std::unique_ptr<Node> clone(const Node& n) {
    auto out = std::make_unique<Node>();
    out->fields = n.fields;
    for (const auto& [k, c] : n.children) out->children[k] = clone(*c);
    return out;
}
void merge(Node& base, const Node& over) {
    for (const auto& [k, v] : over.fields) base.fields[k] = v;
    for (const auto& [k, c] : over.children) {
        if (Node* dst = base.children[k].get()) merge(*dst, *c);
        else base.children[k] = clone(*c);
    }
}