1. Putting the tag-type two lines down instead of on the same line as the closing brace is curious.

1. I wonder why you don't use `createNode()` in `insertRight()` and `insertLeft()`.

1. If you don't need to modify something, don't require the right. Use `const`.

1. `isTreeUniv()` is just wrong. It only checks the direct descendents, while it should recurse into them.

1. Consequently, `countUnivSubT()` is also wrong. Still, fixing `isTree()` would result in a quadratic algorithm, when it should be linear. The idea is to get all the info you need at once.

1. You shouldn't use a global for the subtree-counts. It makes the code non-reentrant.

```
static bool countUnivSubTimpl(const stTree* node, const stTree* parent, size_t* count) {
    if (!node) return true;
    bool r = node->value == parent->value;
    r &= countUnivSubTimpl(node->left, node, count);
    r &= countUnivSubTimpl(node->right, node, count);
    count += r;
    return r;
}
size_t countUnivSubT(const stTree* node) {
    size_t r = 0;
    countUnivSubTimpl(node, node, &r);
    return r;
}