Tree item:
typedef struct tree{ char * word; struct tree *left,*right; }TREE; #define NL 7 It is necessary to delete all elements for which the length of the word >= NL function to delete a single element:
#define NoSubTree 0 #define LeftSubTree -1 #define RightSubTree 1 #define TwoSubTrees 2 void deleteNode(char* word, TREE** his_root) { TREE* proot = *his_root, * new_root, *ppar; int cmp, substr, word_l, root_l; if (proot == NULL) { return; } cmp = strcmp(proot->word, word); word_l = strlen(word); root_l = strlen(proot->word); if (cmp == 0) { if (proot->left == NULL && proot->right == NULL) { substr = NoSubTree; } else if (proot->right == NULL) { substr = LeftSubTree; } else if (proot->left == NULL) { substr = RightSubTree; } else { substr = TwoSubTrees; } switch (substr) { case NoSubTree: *his_root = NULL; break; case LeftSubTree: *his_root = proot->left; break; case RightSubTree: *his_root = proot->right; break; case TwoSubTrees: new_root = proot->left; ppar = proot; while (new_root->right != NULL) { ppar = new_root; new_root = new_root->right; } new_root->right = proot->right; // присоединяем правое поддерево if (new_root != proot->left) //если не вершина левого поддерева { ppar->right = new_root->left; new_root->left = proot->left; // присоединяем левое поддерево } *his_root = new_root;//замена корня freeNode(proot); return; } } if (root_l > word_l || (cmp > 0 && root_l == word_l)) { deleteNode(word, &proot->left); } if (word_l > root_l || (cmp < 0 && root_l == word_l)) { deleteNode(word, &proot->right); } } Walk through the tree and search for suitable words ( root is a global pointer to the root).
void search_words(TREE* proot) { if (proot == NULL) { return; } search_words(proot->right); if (strlen(proot->word) >= NL) { deleteNode(proot->word, &root); } search_words(proot->right); } Deleting 1 item works, as I understand it, the problem is precisely in finding words.