We would like in this question to arrange words of any length in a tree structure represented in levels as follows: each node $$p$$ of the tree of level $$i$$ has the following structure:
typedef char element;
typedef struct node
{
element data;
struct node *left, *right, *nextlevel;
} *tree;
All characters arranged in the left subtree are strictly less than $$\texttt{data}$$.
All characters arranged in the right subtree are strictly greater than $$\texttt{data}$$.
A word of the form: $$C_1 C_2 \cdots C_n$$ will be arranged as follows:
$$C_1$$ in the tree of level 1
$$C_2$$ in the tree of level 2 pointed by the $$C_1$$ node
$$\cdots$$
$$C_i$$ in the tree of level $$i$$ pointed by the $$C_{i-1}$$ node.
Example: After inserting the words: $$\texttt{mn}$$, $$\texttt{ke}$$, $$\texttt{me}$$, $$\texttt{r}$$, $$\texttt{uf}$$, $$\texttt{kn}$$, $$\texttt{ub}$$, $$\texttt{mz}$$, $$\texttt{kd}$$, $$\texttt{ubc}$$, $$\texttt{ubz}$$, and $$\texttt{ubb}$$, we get the following tree:
- Write a recursive function that searches for a character $$x$$ in a tree $$A$$ and returns the address of the node containing the character $$x$$ , $$\texttt{NULL}$$ otherwise.
- Write a recursive function that inserts a character $$x$$ into a tree $$A$$ and returns also the address of the newly created node.
Using the functions written above:
- Write a function that determines the largest prefix (of maximum length) in the tree structure of a given word. (Example if $$\texttt{word}$$ = "$$\texttt{ubt}$$", the largest prefix that exists in the structure is "$$\texttt{ub}$$").
Your function should return the $$\texttt{length}$$ of the prefix and the $$\texttt{address}$$ of the last character of the prefix in the structure. - Deduct by writing the search function of a given $$\texttt{word}$$ from the prefix search.
- Use the $$\texttt{prefix}$$ and $$\texttt{insert}$$ functions to insert a given word in the tree.
Difficulty level
Video recording
This exercise is mostly suitable for students
tree find(tree A, element x)
{
if (A == NULL)
return NULL;
else
if (A->data == x)
return A;
else
if (A->data > x)
return find(A->left, x);
return find(A->right,x);
}
int insert(element x, tree *A, tree *B)
{
if (*A == NULL)
{
*A = (tree)malloc(sizeof(struct node));
if (!(*A)) return 0;
(*A)->data = x;
(*A)->left = (*A)->right = (*A)->nextlevel = NULL;
*B = *A;
}
else
{
if (x == (*A)->data) return 0;
if (x < (*A)->data)
return insert(x, &((*A)->left), B);
return insert(x, &((*A)->right), B);
}
return 1;
}
void prefix(tree S, element word[], int * length, tree *Address)
{
int stop, i;
tree R;
stop = 0;
i = 0;
*Address = NULL;
while (!stop)
{
R = find(S, word[i]);
if (R == NULL)
stop = 1;
else
{
i++;
*Address = R;
S = R->nextlevel;
}
}
*length = i;
}
int findword(tree S, element word[])
{
int length;
tree Address;
prefix(S, word, &length, &Address);
if (length == strlen(word))
return 1;
return 0;
}
int insertword(tree *S, element word[])
{
int length;
tree Address, adr, B;
int j;
prefix(*S, word, &length, &Address);
if (length == strlen(word))
printf("word exists");
else
{
for (j = length ; j < strlen(word); j++)
{
if (Address != NULL)
adr = Address->nextlevel;
else
adr = *S;
if (!insert(word[j], &adr, &B)) return 0;
if (*S == NULL)
*S = adr;
if (Address != NULL)
if (Address->nextlevel != adr)
Address->nextlevel = adr;
Address = B;
}
}
return 1;
}
Back to the list of exercises
Looking for a more challenging exercise, try this one !!
Implementation of a set using an array of long integers as bits