2009-08-03 4 views
0

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

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

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

Предоставьте псевдокод для этого алгоритма.

+0

Преобразовал вопрос в wiki, так как автор, похоже, не заинтересован в его владении. Некоторые из ответов заслуживают сохранения, хотя, на мой взгляд. –

ответ

4

Посмотрите на обе ветви. Найдите длину кратчайшего пути в каждом. Добавьте один к меньшему и считайте его кратчайшим.

+1

Это будет по сути написанием кода для вас - просто попробуйте перевести то, что я написал в код :) – bdonlan

+0

rachel: псевдокод itrue более или менее такой же, как и ответ bdonlan, и Alex Martelli использует ту же идею. Это может быть немного трудно следовать, но вытащите образец дерева и старайтесь внимательно следить за всеми тремя ответами. Вы, вероятно, захотите делать заметки по пути, чтобы не потеряться. Надеюсь, вы увидите, что все трое делают одно и то же (за исключением различия в возврате самой ветви по отношению к длине). – MatrixFrog

0
function recurseMin(n) 
{ 
if r(n) is null and l(n) is null, return 1 
if r(n) is not null, rightSum = recurseMin(r(n-1)) 
if l(n) is not null, leftSum = recurseMin (l(n-1)) 
return 1 + min(leftSum, rightSum) 
} 
+3

recurseMin(), похоже, принимает аргумент ... – hughdbrown

+0

По какой-то причине есть кнопка «изменить». Странно, что трое отдельных людей могли бы отказаться, не исправляя это. –

+0

Кроме того, у вас, похоже, много 1-го. Если у вас есть дерево с тремя узлами (например, корень, левый и правый), я думаю, что вы получите счет 3. Корень 1 + мин (leftSum, rightSum). leftSum - 1 + recurseMin (слева). recurseMin (слева) - 1. rightSum - то же самое. Yup, глубина 3. – hughdbrown

5

Я вижу, что вы получили ответы о том, как получить длиной кратчайшей ветви, но ваше домашнее задание на самом деле вернуть филиал самих, по-видимому, как список узлов. Итак, вот исполняемый псевдокод (то есть, Python) на самом деле вернуть ветвь, используя None означает нуль:

def MinBranch(l, r, x): 
    if x is None: return [] 
    left_one = MinBranch(l, r, l(x)) 
    right_one = MinBranch(l, r, r(x)) 
    if len(left_one) < len(right_one): 
    tail = left_one 
    else: 
    tail = right_one 
    return [x] + tail 
+0

Ницца, Алекс. – hughdbrown

+0

@hugh, рад, что вам понравилось, и спасибо! –

1

Вы также можете найти его в O (2 R), где R является результатом. Полезно, если дерево очень несбалансированное или бесконечное. Это < = O (N).

Вы можете сделать это с помощью итерационно углубляющегося DFS.

Смежные вопросы