Binary search large tree in C
node *cur is not necessary. A c idiom is

if (node_id &lt; root-&gt;node_id) {
    root-&gt;left = insert_node(root-&gt;left, data, node_id, name);

find_node_data is unnecessarily recursive. The compiler may understand that it is a tail recursion, and optimize it out, but it always better to be explicit:

    while (root) {
        if (root-&gt;node_id == node_id) {
            break;
        }
        root = root-&gt;node_id &gt; node_id? root-&gt;left: root-&gt;right;
    }
    return root;


Note the insertion may also be made iterative, although much less elegant.
The line

printf("node data %d %s", find_node_data(root, T)-&gt;data, find_node_data(root, T)-&gt;name);


looks really strange. Why do you call find_node_data twice, and why don't you call print, which you are already defined?