树元素:
typedef struct tree{
char * word;
struct tree *left,*right;
}TREE;
#define NL 7
您需要移除所有长度为的word >= NL
元素 一个元素移除函数:
#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);
}
}
遍历树并寻找匹配的单词(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);
}
删除 1 个元素有效,据我所知,问题在于搜索单词。
没有进入删除本身......
您是否仅在右子树中递归搜索两次?离开不感兴趣?
还有一件事 - 这并不重要,但它是一种糟糕的风格 - 将函数称为搜索函数,但也将其删除......