Consider the following declaration of a BST in which the field nbd denotes the number of descendants of a tree node:

typedef struct node
{
    
element data ;
    
int nbd ;
    
struct node *Left, *Right ;
} *BST;

 

  • Write a function that inserts an element to a BST;
  • Write a function that tests that the field nbd of each BST node is correct.

Difficulty level
This exercise is mostly suitable for students
int insert_BST(BST *B, element1 e)
{
	int v;
	if(*B==NULL)
	{
		*B=(BST)malloc(sizeof(struct node));
		(*B)->data=e;
		(*B)->right=(*B)->left=NULL;
		(*B)->nbd=0;
		return 1;
	}
	if((*B)->data==e)
		return 0;
	if((*B)->data < e)
		return insert_BST(&((*B)->right),e) && ++((*B)->nbd); 
	else
		return insert_BST(&((*B)->left),e) && ++((*B)->nbd); 
}

int check(BST B)
{
	int i=0;
	return check_r(B,&i);
}

int check_r(BST B, int *e)
{
	int l=1,r=1,e1=0,e2=0;
	if(B==NULL) return 1;
	if(B->left==NULL && B->right==NULL)
	{
		*e=B->nbd;
		return (B->nbd==0);
	}
	if(B->left)
	{
		l=check_r(B->left,&e1);
		e1++;
	}
	if(B->right)
	{
		r=check_r(B->right,&e2);
		e2++;
	}

	if((e1+e2)==B->nbd)
	{
		*e=e1+e2;
		return l && r;
	}
	return 0;
		
}

Back to the list of exercises
Looking for a more challenging exercise, try this one !!
Statically implemented Binary Tree