Я пытаюсь написать эту функцию:Как подрезать структуру данных дерева на заданной глубине в C
struct treeNode *pruneTree(struct treeNode *root, int depth);
Который дал дерево вроде:
1 level 0
/\
2 3 level 1
/\ \
4 5 6 level 2
/\
7 8 level 3
Если глубина = 1, то создать дерево с глубиной = 1 и вырезать все после, так что результат должен быть:
1
/\
2 3 // tree with depth = 1
Я знаю, как написать функцию, которая чернослив в Lea VES, и я стараюсь, чтобы адаптировать его к подрезать на любом уровне:
int isLeaf (struct treeNode * treeNode) {
return (treeNode->left == NULL) && (treeNode->right == NULL);
}
void removeLeaves(struct treeNode * root) {
if (root->left != NULL) {
if (isLeaf (root->left)) {
free(root->left);
}
else {
removeLeaves(root->left);
}
}
if (root->right != NULL) {
if (isLeaf (root->right)) {
free(root->right);
}
else {
removeLeaves(root->right);
}
}
}
Что такое хорошая стратегия, чтобы сделать это? Мой подход заключается в замене функции isLeaf
функцией isAfterDepth
и использованием вспомогательной функции, которая вычисляет глубину, но это не кажется эффективным. Что является более элегантным способом сделать это?
не должен «Вы сначала« освобождаете »/' удаляете узлы? Это похоже на программу, которая будет генерировать утечки памяти. –
Я изменил программу, чтобы отразить это. – user6005857
Другой вопрос: вы только делаете копию? Вы не изменяете данное дерево? –