Bir diziye BST derin yolu koyun (yinelemeli)

oy
1

Im bir özyinelemeli algoritması kullanarak bir BST'de bir diziye en derin yolu koymak için çalışıyor ve ben olsun tek şey en uzun yolu (yüksekliğine eşdeğer) büyüklüğünde olduğu için im birkaç zorluklar ... alma ve i cant değerler BST yüksekliğine ilişkin dizide koymak ...

Herhangi bir yardım?

Üzgünüm, tüm şekilde sorunu ortaya vermedi. Bu algoritma yapmak bildiğimiz tek şey bu imzadır:

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

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

(I aux yöntemleri kullanabilir)

Oluştur 24/07/2009 saat 23:04
kaynak kullanıcı
Diğer dillerde...                            


2 cevaplar

oy
1

En derin yolu yeniden bir araç olarak düğümleri kullanmayı deneyin

Eğer sahip olabilir sorunu da ağaç travers olarak fiili düğümleri depolamak için hiçbir şekilde olması. Ne gerek sen derin olarak gördükleri yaprak yolunda ziyaret ettik düğümlerin "hatırlamak" için bir yoldur.

senin BST düğümler katılma halinde, onun ebeveyne, her çocukta, bir başvuru depolamak düşünebilirsiniz. Eğer derin yaprak geldiğimde Bu şekilde, yinelemeli geri köküne (: yol ters sırada olacak NOT) yolunu yeniden başladı. böylece gibi:

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;
}

Orada bu düğümlerin kullanmak istemiyorsanız yapmak için başka yolları vardır, ancak bu kafanın içinde sorunu görselleştirmek için kolay bir yoldur.

Cevap 24/07/2009 saat 23:29
kaynak kullanıcı

oy
0

ebeveyn referanslarla

Onun üst bir referansı vardır böylece her düğüm kurmak, sadece derin düğümü bulmak ve sonra ebeveynler aracılığıyla takip ederek ağacın köküne kadar oradan geri yürüyebilir. Bu kesinlikle ekstra sahip pahasına yapmanın en kolay şeydir parentNodeher düğüm referans değişkeni.

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

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

ebeveyn referanslar olmadan

Üst başvuruları yoksa sen ağacın üzerinden recurse olarak, o zaman "güncel" düğüme ağacın kökünden yolun takip edebilirsiniz. Her zaman dışarı alt "en uzun yolu şimdiye kadar" olarak yolu artık önceki daha uzunsa "en uzun yolu şimdiye kadar" bu yolu kaydedin. Etkili senin çağrı yığını açık hale gelir.

İşte bazı Python imsi kod:

# 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)
Cevap 24/07/2009 saat 23:31
kaynak kullanıcı

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