Do pole nejhlubší dráhu BST (rekurzivní)

hlasů
1

Im snaží dát do pole nejhlubší cestu na BST pomocí rekurzivního algoritmu, a im stále několik problémů ..., protože to jediné, co jsem si je velikost nejdelší dráhy (ekvivalent do výšky), a já dotírat dal v poli hodnoty týkající se výšky BST ...

Nějaká pomoc?

Omlouvám se, jsem neměl vystavit problém v celé cestě. Jediná věc, která vím, že dělat tento algoritmus je tento podpis:

//each node has 3 references : value, left and right

private int [] deepestPath(Node root){ ...}

(I mohou používat pomocné metody)

Položena 24/07/2009 v 23:04
zdroj uživatelem
V jiných jazycích...                            


2 odpovědí

hlasů
1

Zkuste použít uzlů jako nástroje k rekonstrukci nejhlubší cestu

Problém možná budete mít, je, že budete mít žádný způsob, jak uložit aktuální uzly, jak si procházet strom. To, co potřebujete, je způsob, jak „pamatovat“, které uzly, které jste navštívili na cestě do listu, který považují za nejhlubší.

Je-li váš BST zastoupena v uzlech, možná budete chtít, aby zvážila uložení odkazu v každé dítě, jeho rodiče. Tímto způsobem, když se dostal do nejhlubšího listu, můžete rekurzivně rekonstruovat cestu zpět do kořenového adresáře (poznámka: Cesta bude v obráceném pořadí). Jako tak:

if (isDeepest(node)) { // Once you find the deepest node...
  return reconstructPath(node); // ...reconstruct the path that took you there.
}

...

// reconstructPath is a method that takes a node (the deepest leaf) as 
// an argument and returns an array of the nodes from that node to the root.
private Array reconstructPath(Node node) {
  Array deepestPath = new Array();
  while(node.parent != node) { // Go up until you reach the root, which will be itself.
    deepestPath.add(node); // Add the node to end of the Array
    node = node.parent; // Go up one level to the parent of the node
  }
  deepestPath.reverse(); // reverse the order so it goes root->leaf
  return deepestPath;
}

Existují i ​​jiné způsoby, jak dělat to, pokud nechcete používat uzly, ale je to snadný způsob, jak představit problém ve vaší hlavě.

Odpovězeno 24/07/2009 v 23:29
zdroj uživatelem

hlasů
0

S mateřskými referencí

Nastavíte-li si každý uzel tak, že obsahuje odkaz na své mateřské společnosti, můžete jen najít nejhlubší uzel a pak pěšky zpátky odtamtud ke kořeni stromu sledováním prostřednictvím rodičů. To je určitě nejjednodušší věc udělat, na úkor s další parentNodereferenční proměnné v každém uzlu.

# Iterate through parents to trace the path in reverse.
node = deepestNode(tree)

while node.parent != None:
    node = node.parent

Bez mateřských referencí

Pokud nemáte nadřazené odkazy, pak můžete sledovat cestu od kořene stromu „aktuální“ uzel, jak rekurzivně přes stromu. Kdykoliv spodní ven, kromě toho, že cesta za „nejdelší cestu tak daleko“, pokud je cesta delší než předchozí „nejdelší cestu tak daleko“. Efektivně to znamená, aby vaše zásobník volání explicitní.

Zde je několik Python-ish kód:

# Public function. Sets up globals and then calls helper.
def deepestPath(tree):
    global longestPath, currentPath

    # Reset for a new search.
    longestPath = []
    currentPath = []

    _deepestPath(tree.root)

    return longestPath

# Helper function that does the real work.    
def _deepestPath(node):
    global longestPath, currentPath

    currentPath.append(node)

    # No children, we've bottomed out.
    if not node.left and not node.right:
        if currentPath.length > longestPath.length:
            # Save a copy of the current path.
            longestPath = list(currentPath)

    # Recurse into children.
    else:
        if node.left:  _deepestPath(node.left)
        if node.right: _deepestPath(node.right)

    currentPath.pop(node)
Odpovězeno 24/07/2009 v 23:31
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more