Ecco una implementazione JavaScript che simula Larghezza Prima attraversamento con profondità Prima ricorsione. Sto memorizzando i valori del nodo ad ogni profondità all'interno di un array, all'interno di un hash. Se un livello esiste già (abbiamo una collisione), quindi dobbiamo solo passare alla matrice a quel livello. Potresti usare una matrice invece di un oggetto JavaScript poiché i nostri livelli sono numerici e possono servire come indici di array. È possibile restituire nodi, valori, convertire in un elenco collegato o qualsiasi altra cosa si desideri. Sto solo restituendo i valori per motivi di semplicità.
BinarySearchTree.prototype.breadthFirstRec = function() {
var levels = {};
var traverse = function(current, depth) {
if (!current) return null;
if (!levels[depth]) levels[depth] = [current.value];
else levels[depth].push(current.value);
traverse(current.left, depth + 1);
traverse(current.right, depth + 1);
};
traverse(this.root, 0);
return levels;
};
var bst = new BinarySearchTree();
bst.add(20, 22, 8, 4, 12, 10, 14, 24);
console.log('Recursive Breadth First: ', bst.breadthFirstRec());
/*Recursive Breadth First:
{ '0': [ 20 ],
'1': [ 8, 22 ],
'2': [ 4, 12, 24 ],
'3': [ 10, 14 ] } */
Questo è un esempio di ampiezza del primo attraversamento iniziale utilizzando un approccio iterativo.
BinarySearchTree.prototype.breadthFirst = function() {
var result = '',
queue = [],
current = this.root;
if (!current) return null;
queue.push(current);
while (current = queue.shift()) {
result += current.value + ' ';
current.left && queue.push(current.left);
current.right && queue.push(current.right);
}
return result;
};
console.log('Breadth First: ', bst.breadthFirst());
//Breadth First: 20 8 22 4 12 24 10 14
fonte
2015-02-19 09:05:03
domanda molto buona. questo non è affatto semplice. fondamentalmente stai chiedendo di implementare un BFS usando solo uno stack. – sisis
in modo ricorsivo con solo uno stack? questo mi fa male alla testa –
Io di solito uso una pila per rimuovere il comportamento ricorsivo – Newtopian