Помещенный в массив глубочайшие путь к BST (рекурсивный)

голоса
1

Im пытается поставить в массив глубочайшего пути на BST, используя рекурсивный алгоритм, и им получать некоторые трудности ... потому что единственное, что я получаю размер самого длинного пути (эквивалент высоты), и я не могу поместить в массив значения в отношении к высоте BST ...

Любая помощь?

К сожалению, я не обнажить проблему во всем укладе. Единственное, что я знаю, чтобы сделать этот алгоритм является сигнатура:

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

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

(Можно использовать методы проигрываемых)

Задан 24/07/2009 в 23:04
источник пользователем
На других языках...                            


2 ответов

голоса
1

Попробуйте использовать узлы в качестве инструмента для восстановления глубочайшего пути

Проблема, которая может быть с, что вы не имеете никакого способа хранить фактические узлы, как вы обход дерева. Что вам нужно, это способ «запомнить», какие узлы, которые вы посетили на пути к листу, который вы считаете самым глубоким.

Если BST представлен в узлах, вы можете рассмотреть вопрос о сохранении ссылки, в каждом ребенке, его родитель. Таким образом, когда вы попали в глубочайшем лист, можно рекурсивно реконструировать путь к корню (Примечание: Путь будет в обратном порядке). Вот так:

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

Есть и другие способы сделать это, если вы не хотите использовать узлы, но это простой способ визуализировать проблему в вашей голове.

Ответил 24/07/2009 в 23:29
источник пользователем

голоса
0

С родительским ссылками

Если настроить каждый узел так , что он имеет ссылку на его родитель, вы можете просто найти самый глубокий узел , а затем идти назад оттуда к корню дерева, прослеживая через родитель. Это, безусловно , проще всего сделать за счет наличия дополнительного parentNodeссылочной переменной в каждом узле.

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

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

Без родительских ссылок

Если вы не имеете родительские ссылок, то вы можете отслеживать пути от корня дерева к «текущему» узлу, как вы рекурсии через дерево. Каждый раз, когда вы Дно, сохранить этот путь как «самый длинный путь до сих пор», если путь длиннее предыдущей «длинный путь до сих пор». Эффективно это означает, что делает ваш стек вызовов явным.

Вот некоторые Python-МОГ код:

# 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)
Ответил 24/07/2009 в 23:31
источник пользователем

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