internal void Scan() { if (Root.NbKeys == 0) { return; } ScanDataClass scanData = new ScanDataClass(); ScanBTree(Root, 0, scanData); Helper.Trace($"lgChemin={scanData.lgChemin}, nbkeysmax={scanData.nbKeysMax}, nbkeysactual={scanData.nbKeysActual}, remplissage={100.0 * scanData.nbKeysActual / scanData.nbKeysMax} %"); Helper.Assert(scanData.nbKeysActual == NbKeys); }
private void ScanBTree(BTreeNode node, int profondeur, ScanDataClass scanData) { scanData.nbKeysMax += Order - 1; scanData.nbKeysActual += node.NbKeys; bool bchildren = !node.Leaf; Helper.Assert(node == Root || IsAtLeastHalfFull(node)); if (bchildren) { // On descend en bas à gauche Helper.Assert(node.NbKeys == node.NbChildren - 1); ScanBTree(node.Child(0), profondeur + 1, scanData); } else if (scanData.bLgCheminSet) { Helper.Assert(profondeur == scanData.lgChemin); } else { scanData.lgChemin = profondeur; scanData.bLgCheminSet = true; } for (int i = 0; i < node.NbKeys; i++) { int value = node.Key(i); if (!scanData.previousValueSet) { Helper.Assert(i == 0 && !bchildren); scanData.previousValue = node.Key(0); scanData.previousValueSet = true; } else { // previousValue est censée être la plus grande key dans le sous-arbre à gauche Helper.Assert(scanData.previousValue < value); scanData.previousValue = value; } if (bchildren) { ScanBTree(node.Child(i + 1), profondeur + 1, scanData); } } }