Ich arbeite an einem B-Baum (oder ist es BTree?) Für eine Klasse, die ich derzeit nehme. Ich habe das meiste davon richtig umgesetzt (glaube ich). Allerdings habe ich Probleme, eine Inorder-Traversierung zu finden. Hier ist meine Hauptfunktion:Inorder Traversal eines B-Baumes (C++)
Also ich bin ein 5-Wege-Baum, der Zeichen enthält. Ich füge jeden der Zeichen in den Baum ein und zeige dann den Invers-Durchlauf für jede Iteration zu Debugging-Zwecken an. Dies ist die Ausgabe erhalte ich:
0: a
1: ag
2: afg
3: abfg
4: abffgk
5: abdgfgk
6: abdgfghk
7: abdgfghkm
8: abdgfghjjkm
9: abdefghjjkm
10: abdefghjjkms
11: abdefghimjkms
12: abdefghimjkmrs
13: abdefghimjkmrrsx
14: abccdefghimjkmrrsx
15: abccdefghimjklmsrsx
16: abccdefghimjklmnrsx
17: abccdefghimjklmnrstx
18: abccdefghimjklmnrstux
19: abccdefghimjjklmmnprstux
In fast alle von ihnen, einige der Zeichen dupliziert werden, aber nicht konsequent zwischen Einfügungen, so ist es (für mich) scheint nicht, wie doppelte Daten zu bekommen. ich kann nicht Sinn zu machen scheinen, aber hier ist meine inorder Methode:
template <class Record, int order>
void Tree<Record, order>::inorder()
{
inorder(root);
}
template <class Record, int order>
void Tree<Record, order>::inorder(Node<Record, order> *current)
{
for (int i = 0; i < current->count+1; i++) {
if (current->branch[i])
inorder(current->branch[i]);
if (i < order-1 && current->data[i])
cout << current->data[i];
}
}
in meinem Knoten Implementierung Zahl ist die Anzahl von ‚Daten‘ (jedes Zeichen) im Baum. count + 1 wäre, wie viele Zweige aus dem Knoten für die Nicht-Blattknoten kommen. branch ist ein Array des nächstniedrigeren Knotensatzes, data ist ein Array der chars.
Hier ist meine Knoten Implementierung:
template <class Record, int order>
struct Node
{
int count;
Record data[order - 1];
Node<Record, order>* branch[order];
Node() : count(0) {}
};
Hier ist alles verwendet, einfügen:
template <class Record, int order>
ErrorCode Tree<Record, order>::insert(const Record& new_entry)
{
Record median;
Node<Record, order> *right_branch, *new_root;
ErrorCode result = push_down(root, new_entry, median, right_branch);
if (result == overflow) {
new_root = new Node<Record, order>();
new_root->count = 1;
new_root->data[0] = median;
new_root->branch[0] = root;
new_root->branch[1] = right_branch;
root = new_root;
result = success;
}
return result;
}
template <class Record, int order>
ErrorCode Tree<Record, order>::push_down(
Node<Record, order> *current,
const Record &new_entry,
Record &median,
Node<Record, order> *&right_branch)
{
ErrorCode result;
int position;
if (current == NULL) {
median = new_entry;
right_branch = NULL;
result = overflow;
}
else {
if (search_node(current, new_entry, position) == success)
result = duplicate_error;
else {
Record extra_entry;
Node<Record, order> *extra_branch;
result = push_down(current->branch[position], new_entry,
extra_entry, extra_branch);
if (result == overflow) {
if (current->count < order - 1) {
result = success;
push_in(current, extra_entry, extra_branch, position);
}
else
split_node(current, extra_entry, extra_branch, position,
right_branch, median);
}
}
}
return result;
}
template <class Record, int order>
void Tree<Record, order>::push_in(Node<Record, order> *current,
const Record &entry,
Node<Record, order> *right_branch,
int position)
{
for (int i = current->count; i > position; i--) {
current->data[i] = current->data[i-1];
current->branch[i+1] = current->branch[i];
}
current->data[position] = entry;
current->branch[position+1] = right_branch;
current->count++;
}
Bitte zeigen Sie uns die Node-Datenstruktur - ich verstehe nicht, warum 'branch' scheinbar' count + 1' Elemente lang ist. Die Struktur zu zeigen ist klarer als zu versuchen, sie zu beschreiben. Was steuert der Template-Parameter 'order'? –
Der Parameter der Auftragsvorlage steuert, in welcher Reihenfolge ein Baum arbeitet, mit dem wir arbeiten. In diesem Fall ein 5-Wege-Baum (Baum * Baum = neuer Baum ). Hinzufügen von Knoten jetzt .... –
gregghz
@ greggory.hz können Sie klären, was "count" bedeutet? Ist es die Anzahl der Zweige, die hinzugefügt wurden? oder die Anzahl der 'Daten' Elemente? oder etwas anderes? Ich denke, es könnte einen Fehler geben, wie count verwendet wird, aber es ist schwer zu sagen, ohne zu wissen, wie 'insert' es benutzt. – MerickOWA