Der Aufbau des Baumes ist ja auch nicht mein Problem. Das Problem habe ich nur bei den Rotationen. Da geht mir dann die Sortierung verloren (Knoten1 == Knoten2 -> Knoten1 links von Knoten 2). Es kann passieren, dass nach der Rotation Knoten2 rechts von Knoten1 liegt (rechts-rotation), wobei er eigentlich links davon liegen müsste. Somit müsste ich ja beide Kindknoten untersuchen.
Ich glaube du bist hier wieder etwas verwirrt: Die inorder eines Baumes ist das aufzählen der knoten (beginnend bei der Wurzel) indem man rekursiv sein linkes Kind aufzählt, dann sich selbst nennt, dann rekursiv sein rechtes Kind. Ein Baum ist jetzt Inorder-sortiert, wenn die entstehende Folge nach einer beliebigen Ordnung < sortiert ist. Wenn du dir jetzt anschaust was die zwei Arten von (Basis)rotationen machen, dann wirst du feststellen, dass keine dabei die Inorder verändert. Insofern verändert sich auch nicht die Sortierung.
Was du für das eigentliche Problem hälst ist also, die Navigierung im Baum, denn normalerweise hat man <= des aktuellen Knotens im linken Teilbaum und > im rechten. Die Frage ist jetzt aber, ob man das in deinem Fall wirklich braucht und da sehe ich nicht warum. Insofern müsstest du mir ein Szenario zeigen, bei dem es nicht ausreicht zu wissen, dass links <= ist und rechts >=, weil für alles was ich sehen kann reicht beim Allozieren von Speicher die Suche nach >= und beim Freigeben ist es dann egal wohin man navigiert, man darf ja auf beiden Seiten einfügen (solange die Größen gleich sind).
Das einzige Szenario, das ich sehen kann, ist - wie oben bereits angesprochen - dass du in dem "Adress-Baum" was gefunden hast und löschen willst und die Änderung dann in dem "Größe-Baum" nachziehen willst. Das Problem kann man aber durch Zeiger jedes Knotens im "Adress-Baum" zu dem entsprechenden Knoten des "Größe-Baums" lösen, denn dann braucht man nichtmehr im anderen Baum suchen (nach was auch? Der Baum hat schließlich keine eindeutigen Identifikationen, da macht "ich will _genau_den_ Knoten mit Größe 5 löschen" einfach keinen Sinn), sondern kann die Abkürzung über den Zeiger nehmen.
Die andere Art das zu Lösen ist wie gesagt die Identifikationen wie oben beschrieben eindeutig zu machen.
edit: Ich kann übrigens - wie immer - nur dazu raten dir zu überlegen welche Operationen du unterstützen willst (Ein/Ausgabe genau spezifizieren) und dann zu schauen ob das mit dem geplanten Baum geht. Wo es nicht geht muss man halt eventuell den Baum aufbohren, die Sortierung ändern... zB rede ich von den Operationen (im "Größe-Baum"):
* (size, address) allocate(size) (geht ohne Probleme unter der sinnvollen Annahme, dass alle Knoten der Größe >= size akzeptabel sind [und nicht genau ein spezieller])
* void free(size, address)
* entweder void remove_from_tree(size, address) (falls man die Ordnung so wie oben ändert) oder void remove_from_tree(node_t*) (falls man Zeiger von einem Baum in den anderen hat), um wie oben beschrieben Änderungen aus dem anderen Baum nachzuziehen