Я работаю над слиянием двух шаблонов AVL деревьев в 1 дерево со сложностью всего несколько узлов в обоих деревьях (что сложно) - правильный алгоритм построить полное двоичное дерево с количеством узлов всего - если сумма равна мощности 2 минус 1 или создать полное двоичное дерево с большим количеством узлов, чем общее (следующая мощность 2) и вырезать ненужные листья (разница между суммой и следующей мощностью 2), в то время как узлы также являются шаблонами и должны быть пустыми. Как я могу построить полное двоичное дерево с пустыми узлами без какого-либо сравнения клавиш (у меня не может быть никаких ключей, поскольку узлы являются шаблонами)?Как создать полное двоичное дерево с пустыми узлами
мой шаблон узла:
class avl_node{
private:
friend class avl_tree;
//design to contain dinamically allocated key and data only!
//assumption- every node uses it's own data and key- no data or key are the
//same memory for different nodes!
Key *key;
T *data;
avl_node *parent;
avl_node *right;
avl_node *left;
int height;
int balance;
int maxHeight(int h1,int h2){
return (h1 > h2) ? h1:h2;
}
public:
avl_node(Key* key=nullptr, T* data=nullptr): key(key),data(data),right(nullptr),left(nullptr),parent(nullptr),height(0),balance(0){}
//no setKey since this is an invariant from node creation
virtual ~avl_node(){
delete key;
delete data;
delete right;
delete left;
}
virtual bool insert(Key* key, T* data,avl_node *& to_fix_from);
virtual avl_node * findNode(const Key& key);
virtual void updateStats() {
if(left && right){
height=maxHeight(left->height,right->height)+1;
balance=left->height-right->height;
return;
}
if(!left && right){
height=right->height+1;
balance=-right->balance;
return;
}
if(left &&!right){
height=left->height+1;
balance=left->height;
return;
}
this->height=0;
}
};
этот вопрос IS-Key является шаблоном параметрируемую поэтому я не могу решить, например, чтобы сделать цикл на количество узлов, необходимых и создать некоторые простой ключ (в соответствии с for-loops'counter) и вставить его, поскольку вставка нуждается в некоторой опции для сравнения.
я редактирую вопрос: я узнал here, я могу динамически выделять массив пустых узлов и рекурсивно назначить каждый узел с левой и правой, как в бинарном поиске (на индексы массива). новый вопрос: могу ли я освободить каждый узел один за другим от указателя на этот узел, хотя они были выделены в массиве? потому что я хотел остаться только с одним корнем и рассматривать его как дерево с совместимой функцией удаления.
Объясните свою проблему более подробно. Как это связано с C++? –
Что означает «узлы шаблона»? Вы знаете, как построить * один * узел так, как вы хотите? Что, если общее число узлов не 2^n-1? – Beta
Я сейчас отредактирую его, посмотрю и спасибо @KirillKobelev –