Как удалить поддерево полностью?

Пишу бинарное дерево. Нужно реализовать удаление узла и всех его дочерних узлов другими словами удалить все поддерево. Я пробовал делать через рекусрию но что-то идет не так как я ожидал. Ошибок нету но работа просто как будто не выполняется. При выводе можно увидеть что все элементы остаются и ничто не удаляется. Код удаления:
template<typename T>
inline void BinTree<T>::deleteSubTree(Node<T>* node)
{
	if (node != nullptr)
	{
		deleteSubTree(node->left);
		deleteSubTree(node->right);
		node = nullptr;
	}
}

Вывод реализован двумя функциями:
template<typename T>
inline void BinTree<T>::print() const
{
	if (root == nullptr)
	{
		cerr << "Error: Tree is empty\n";
		return;
	}
	else {
		cout << "Tree :\t";
		printNode(root);
		cout << endl;
	}
}

template<typename T>
inline void BinTree<T>::printNode(Node<T>* node) const
{
	if (node != nullptr)
	{
		printNode(node->left);
		cout << node->data << "\t";
		printNode(node->right);
	}
}

Код структуры узла:
template <typename T>
struct Node
{
	T data;
	Node* left, * right;
	Node(const  T& data = T(), Node* left = nullptr, Node* right = nullptr)
		: data(data), left(left), right(right)
	{}
};

Код класса бинарного дерева:
template <typename T>
class BinTree
{
public:
	Node<T>* getRoot() {
		return root;
	}
	BinTree() = default;
	void add(const T& data);
	bool isEmpty() const;
	void print() const;
	~BinTree();
	bool check(T left, T right, T data);
	void deleteSubTree(Node<T>* node);
private:
	Node<T>* root = nullptr;
	void printNode(Node<T>* node) const;
};

Код main:
int main() {
	BinTree<int> tree;
	tree.add(56);
	tree.add(34);
	tree.add(41);
	tree.add(65);
	tree.add(64);
	tree.print();
	cout << "\n========================AFTER=DELETION============================\n";
	tree.deleteSubTree(tree.getRoot()->left);
	tree.print();
}

Скорее всего я неправильно реализовал удаление в коде поетому я надеюсь вы меня исправите.
  • Вопрос задан
  • 204 просмотра
Пригласить эксперта
Ответы на вопрос 1
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
node = nullptr;

Этот код переписывает значение указателя node, который является аргументом функции, переданным по значению. Фактически, вы затираете локальную переменную.

Кроме того, ваша функция пытается переписать все указатели нулями, но нигде не делает delete - поэтому там у вас утечка памяти.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы