Для начала, это объявление структуры
struct Node {
int value = -1;
struct Node* left = NULL;
struct Node* right = NULL;
};
недопустимо в C. Вы не можете указывать инициализаторы.
Таким образом, объявление должно выглядеть как
struct Node {
int value;
struct Node* left;
struct Node* right;
};
Функция insert_tree
получает указатель на узел root по значению. То есть функция имеет дело с копией исходного указателя, поэтому изменение копии исходного указателя внутри функции не влияет на значение исходного указателя.
Вам нужно передать указатель по ссылке. В C передача по ссылке означает передачу объекта косвенно через указатель. Учтите, что при выделении памяти может произойти сбой. Желательно, чтобы функция сообщала об успешности вставки нового узла.
Также будет более грамотно сделать первый параметр указателем на указатель на узел root, а второй параметр - значение, которое должно быть вставлено.
В любом случае это объявление функции
void insert_tree(int value, Node* root) {
^^^^^^^^^^
является недопустимым C объявлением функции, потому что напротив C ++ в C вы должны указать ключевое слово struct как
void insert_tree(int value, struct Node* root) {
^^^^^^^^^^^^^^^^^
Рекурсивная функция insert_tree
может быть определена следующим образом
int insert_tree( struct Node **root, int value )
{
if ( *root == NULL )
{
*root = (struct Node*) malloc( sizeof( struct Node ) );
if ( *root != NULL )
{
( *root )->value = value;
( *root )->left = NULL;
( *root )->right = NULL;
}
return *root != NULL;
}
else
{
if ( value < ( *root )->value )
{
return insert_tree( &( *root )->left, value );
}
else
{
return insert_tree( &( *root )->right, value );
}
}
}
И функция может вызываться как
int main( void )
{
struct Node *root = NULL;
insert_tree( &root, 30 );
printTree( root );
}
Также как функция printTree
не изменяет дерево, тогда ее параметр должен иметь квалификатор const
.
void printTree( const struct Node* root ) {
if (root != NULL) {
printf("%i\n", root->value);
printTree(root->left);
printTree(root->right);
}
}
Вот демонстрационная программа C.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
struct Node
{
int value;
struct Node *left;
struct Node *right;
};
int insert_tree( struct Node **root, int value )
{
if ( *root == NULL )
{
*root = (struct Node*) malloc( sizeof( struct Node ) );
if ( *root != NULL )
{
( *root )->value = value;
( *root )->left = NULL;
( *root )->right = NULL;
}
return *root != NULL;
}
else
{
if ( value < ( *root )->value )
{
return insert_tree( &( *root )->left, value );
}
else
{
return insert_tree( &( *root )->right, value );
}
}
}
void printTree( const struct Node* root ) {
if (root != NULL) {
printf("%i\n", root->value);
printTree(root->left);
printTree(root->right);
}
}
int main(void)
{
struct Node *root = NULL;
const int N = 10;
srand( ( unsigned int )time( NULL ) );
for ( int i = 0; i < N; i++ )
{
insert_tree( &root, rand() % N );
}
printTree( root );
return 0;
}
Ее вывод может выглядит как
1
0
9
4
3
7
5
6
5
8