Можно ли использовать одну и ту же функцию вставки для дерева Bst и Avl? Проблема в том, что Bst и Avl имеют разные типы узлов, но я не хочу, чтобы Bst Node имел общий случай (с высотой и Node * parent внутри, что не имеет смысла, потому что нет необходимости в родительском и высотном уровне внутри Bst).Наследование и деревья AVL/BST
class Bst
{
public:
struct Node
{
int value;
Node* left;
Node* right;
};
Node* insert(Node* node) {/* do stuff using Bst::Node */}
// ...
};
class Avl : public Bst
{
public:
struct Node : public Bst::Node
{
int height;
Node* parent;
};
// now I want that Bst::insert use this Node
// instead of the old one
Node* insert(Node* node)
{
Node* inserted_node = Bst::insert(node);
/* rotations stuff */
return inserted_node;
}
};
Примерно то, что я пытаюсь сделать, это Bst::Node "virtual"
.
Итак, как я могу решить проблему внедрения Avl Tree без перезаписи всей функции вставки только потому, что Node изменен?
Почему BST и дерево AVL имеют разные типы узлов? По моему пониманию предмета, представленные данные одинаковы, дерево AVL использует более сложные алгоритмы для вставки и удаления узлов. – Codor
Это одна из тех ситуаций, когда шаблоны и «виртуальные» - это два разных механизма для достижения одного и того же. Но в этом конкретном случае «виртуальный» явно уступает. Это меньше обычного выбора стиля и более хорошего/плохого выбора. – JSF
BST просто нужно значение и указатели влево и вправо, AVL нужно дополнительное значение высоты и указатель родителя. Представленные данные (значение) имеют тот же тип – tjbrn