Кратчайший филиал в бинарном дереве?

голоса
1

Бинарное дерево может быть закодирован с помощью двух функций lи r таких , что для node n, l(n)дать левый ребенка n, r(n) дать право ребенка n.

Ветвь дерева представляет собой путь от корня к листу, длина ветви к конкретному листу этого числа дуг на пути от корня до этого листа.

Пусть MinBranch(l,r,x)быть простым рекурсивным алгоритмом для принятия двоичного дерева , кодируемого л и г функциями вместе с корневым узлом х для двоичного дерева и возвращает длину кратчайшего ветви двоичного дерева.

Дайте псевдокод этого алгоритма.

ОК, так что в основном это то, что я придумал до сих пор:

MinBranch(l, r, x)
{
    if x is None return 0

    left_one = MinBranch(l, r, l(x))

    right_one = MinBranch(l, r, r(x))

    return {min (left_one),(right_one)}
}

Очевидно, что это не является большим или совершенным. Я бы признателен, если люди могут помочь мне получить эту прекрасную и работать - любая помощь будет оценена.

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


5 ответов

голоса
3

Я сомневаюсь, что кто-то будет решать домашние задания для вас прямо вверх. Ключ: возвращаемое значение должно, безусловно, расти выше, так как дерево становится все больше, верно? Однако я не вижу каких-либо числовых литералов в вашей функции, кроме 0, и без добавления операторов либо. Как вы когда-нибудь вернуться большего числа?

Другой угол по тому же вопросу: в любое время вы пишете рекурсивную функцию, она помогает перечислить « что все условия , где я должен перестать называть себя то , что я вернусь в каждом обстоятельстве?»

Ответил 28/08/2009 в 05:15
источник пользователем

голоса
2

Вы находитесь на правильном подходе, но вы не совсем там; ваш рекурсивный алгоритм всегда возвращает 0. (логика почти сразу, хотя ...)

обратите внимание , что длина суб-ветвей на единицу меньше , чем длина ветви; так left_oneи right_oneдолжно быть 1 + MinBranch....

Steping через алгоритм с некоторыми образцами деревьев поможет выявить внедорожных череде ошибок, как этот ...

Ответил 28/08/2009 в 05:16
источник пользователем

голоса
0

То, что вы создали можно рассматривать в качестве поиска в глубину. Однако, учитывая то, что вы после этого (кратчайшей отрасли), это может быть не самым ЭФФЕКТИВНОЙ подход. Подумайте о том, как ваш алгоритм будет выполнять на дерево, которое было очень тяжело на левой стороне (корневой узел), но было только один узел на правой стороне.

Подсказка: рассмотреть в ширину первого поиска подход.

Ответил 28/08/2009 в 05:19
источник пользователем

голоса
0

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

Ответил 28/08/2009 в 05:19
источник пользователем

голоса
1

Похоже, у вас почти есть, но рассмотрят следующий пример:

      4

   3     5

При трассировке через MinBranch, вы увидите , что в вашем MinBranch(l,r,4)вызове:

left_one = MinBranch(l, r, l(x))
         = MinBranch(l, r, l(4))
         = MinBranch(l, r, 3)
         = 0

Это имеет смысл, в конце концов, 3 является листовым узлом, поэтому, конечно, расстояние до ближайшего узла листа равен 0. То же самое происходит для right_one.

Но затем ветер здесь:

return {min (left_one),(right_one)}
     = {min (0), (0) }
     = 0

но это явно не так, потому что этот узел (4) не является листовым узлом. Ваш код забыл посчитать текущий узел (упс!). Я уверен, что вам удастся исправить.


Теперь, на самом деле, они, как вы делаете это не самый быстрый, но я не уверен, что это актуально для этого упражнения. Рассмотрим это дерево:

         4
       3   5
     2
   1

Ваш алгоритм будет подсчитывать левую ветвь рекурсивно, даже если он может, гипотетически, выручать, если вы первый подсчитывали правую ветвь, и отметил, что 3 имеет левый, так что его явно больше, чем 5 (который является листом). Но, конечно же, считая правую ветвь первого не всегда работает!

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

Ответил 28/08/2009 в 05:20
источник пользователем

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