Allen0417 Ответов: 3

Как я могу исправить prblem


#include <iostream>
using namespace std;
template <typename T>
struct tree_node {
	T key;
	tree_node* left = nullptr, *right = nullptr;
	tree_node(T key)
	{
		this->key = key;
	}
};
template <typename T>
void insert(tree_node<int>*& my_tree, T key)
{
	if (my_tree == nullptr) my_tree = new tree_node<T>{ key };
	if (key < my_tree->key) insert(my_tree->left, key);
	else insert(my_tree->right, key);
}

template <typename T>
void visit_every_member(const tree_node<T>* my_tree)
{
	// This uses an inorder traversal
	// 1. traverse left subtree
	// 2. visit the root
	// 3. traverse right subtree

	if (my_tree == nullptr) return; // nothing to visit for an empty tree
	visit_every_member(my_tree->left);  // Step 1. Traverse left subtree
	std::cout << my_tree->key << std::endl; //Step 2.  Visit the root
	visit_every_member(my_tree->right); // Step 3. Traverse right subtree
}
template <typename T>
T FindingPredecessorSuccessor(tree_node<T>* my_tree, tree_node<T>*& pre, tree_node<T>*& suc, T key)
{
	if (my_tree != nullptr) return 0;
	if (my_tree->key == key)
	{
		if (my_tree->left != nullptr)
		{
			tree_node<T>* tmp = my_tree->left;
			while (tmp->right)
			{
				tmp = tmp->right;
			}
			pre = tmp;
		}
		if (my_tree->right != nullptr)
		{
			tree_node<T>* tmp = my_tree->right;
			while (tmp->left)
			{
				tmp = tmp->left;
			}
			suc = tmp;
		}
		return 0;
	}
	if (my_tree->key > key)
	{
		suc = my_tree;
		FindingPredecessorSuccessor(my_tree->left, pre, suc, key);
	}
	else
	{
		pre = my_tree;
		FindingPredecessorSuccessor(my_tree->right, pre, suc, key);
	}

}
int main()
{
	tree_node<int>* pre = nullptr, *suc = nullptr;
	tree_node<int>* my_tree = nullptr;
	int key = 65;
    my_tree = insert(my_tree, 50);
	insert(my_tree, 50);
	insert(my_tree, 30);
	insert(my_tree, 20);
	insert(my_tree, 40);
	insert(my_tree, 70);
	insert(my_tree, 60);
	insert(my_tree, 80);
	visit_every_member(my_tree);
	
	FindingPredecessorSuccessor(my_tree, pre, suc, key);
	if (pre != nullptr)
		cout << "Predecessor is " << pre->key << endl;
	else
		cout << "There is no Predecessor" << endl;
	if (suc != nullptr)
		cout << "Successor is " << suc->key;
	else
		cout << "There is no Successor" << endl;

}


Что я уже пробовал:

Я получил эту проблему в строке "my_tree = insert(my_tree, 50);" на главной функции.
Он показывает, что "тип значения 'void' не может быть присвоен какой-либо сущности типа "tree_node<int>*".

Как я могу это исправить?

3 Ответов

Рейтинг:
2

CPallini

Цитата:
шаблон <typename t="">
void insert(tree_node<int>*& my_tree, T ключ)
Приведенная выше функция возвращает void- это еще ничего. Вы не можете ничего присвоить своей переменной. Обратите внимание, что он принимает ссылку на указатель в качестве аргумента, поэтому вы можете назвать его так:
insert(my_tree, 50);
нет необходимости назначать.


Richard MacCutchan

+5 Наконец-то я понимаю "ссылку на указатель", спасибо.

CPallini

- Спасибо, Ричард.
Ну, ссылки, где вы можете их использовать, являются элегантной (по крайней мере, на мой взгляд) заменой указателей. Таким образом, в коде OP ссылка на указатель просто заменяет эквивалентный двойной указатель (который вы должны использовать, например, с языком программирования C).

Richard MacCutchan

Да, наверное, мне стоит еще немного поработать на RTFM. :)

Рейтинг:
1

Allen0417

У него все еще есть та же проблема после того, как я это сделаю

tree_node<int>* my_tree = new tree_node<int>(); // syntax may not be correct
int key = 65;
my_tree = insert(my_tree, 50);


Richard MacCutchan

Какая проблема? Пожалуйста, не думайте, что мы можем видеть ваш экран или читать ваши мысли: предоставьте все детали.

Patrice T

Воспользуйся Улучшить вопрос чтобы обновить ваш вопрос.
Чтобы каждый мог обратить внимание на эту информацию.

Greg Utas

Серьезно? Вы снова назначаете my_tree, хотя было ясно указано, что insert ничего не возвращает?

Rick York

Как это можно квалифицировать как решение?

Рейтинг:
0

Richard MacCutchan

tree_node<int>* my_tree = nullptr;
int key = 65;
my_tree = insert(my_tree, 50);

Вы инициализируете указатель my_tree к нулевому значению указателя (то есть ничего), а затем попытайтесь использовать эту ссылку так, как если бы она указывала на реальный объект. Вам нужно сделать так, чтобы он указывал на правильный tree_node, например:
tree_node<int>* my_tree = new tree_node<int>(); // syntax may not be correct
int key = 65;
my_tree = insert(my_tree, 50);


Также обратите внимание, что в определении структуры отсутствует тип, он должен быть
template <typename T>
struct tree_node<T>{


То insert функция не возвращает tree_node указатель.

Вероятно, есть и другие проблемы, которые я не заметил.