Ich arbeite am Zusammenführen von 2 Vorlage AVL Bäume in 1 Baum mit einer Komplexität von Gesamt Anzahl der Knoten in beiden Bäumen (was schwierig ist) - der richtige Algorithmus ist Erstellen Sie einen vollständigen Binärbaum mit der Anzahl der Knoten von Gesamt - wenn Summe ist gleich der Macht von 2 minus 1, oder um einen vollständigen Binärbaum mit mehr Knoten als insgesamt (die nächste Potenz von 2) zu erstellen und schneiden Sie die unnötigen Blätter (Diff zwischen Gesamt und der nächsten Potenz von 2), während die Knoten auch Vorlage sind und leer sein sollten. Wie kann ich einen vollständigen Binärbaum mit leeren Knoten ohne Schlüsselvergleich erstellen (ich kann keine Schlüssel haben, da die Knoten eine Vorlage sind)?Wie erstellt man einen vollständigen Binärbaum mit leeren Knoten
meine Vorlage Knoten ist:
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;
}
};
das Problem ist-Key ist eine Vorlage parameter-, so kann ich nicht entscheiden, beispielsweise eine benötigte auf die Menge der Knoten für die Schleife zu machen und einige erstellen Einfacher Schlüssel (laut for-loops'counter) und einfügen - da insert benötigt eine Option zum Vergleichen.
i bin die Bearbeitung die Frage: i here fand heraus, i dinamically ein Array von leeren Knoten zuteilen kann, und jeden Knoten rekursiv mit linken zuweisen und rechts, wie in binärer Suche (auf dem Array-Indizes). neue Frage: kann ich jeden Knoten einzeln von einem Zeiger auf diesen Knoten freigeben - obwohl sie in einem Array zugewiesen wurden? weil ich mit nur einer Wurzel bleiben und es wie ein Baum mit der kompatiblen Löschfunktion behandeln wollte.
Erklären Sie Ihr Problem genauer. Wie steht es mit C++? –
Was bedeutet "die Knoten sind Vorlage"? Weißt du, wie man einen * Knoten so baut, wie du willst? Was ist, wenn die Gesamtzahl der Knoten nicht 2^n-1 ist? – Beta
ich werde es jetzt bearbeiten, nachschlagen und danke @KirillKobelev –