ширина бинарного дерева

У меня была такая же проблема и она была решена, возможно, не лучшим образом, но она работает. Я заменил все разрывы строк до того, как достиг своего реального соответствия:

mystring= Regex.Replace(mystring, "\r\n", "")

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

Я попробовал все вышеперечисленные предложения без везения, я использую .Net 3.5 FYI

-1
задан Divakar 13 July 2018 в 19:25
поделиться

1 ответ

Вы можете использовать рекурсивную функцию, которая возвращает два значения для данного узла: степень поддерева на этом узле влево (отрицательное число или ноль) и степень справа (ноль или положительная). Таким образом, для дерева примеров, заданного в вопросе, оно вернет -1 и 3.

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

Вот как эта функция будет выглядеть в Python:

def extents(tree):
    if not tree:
        # If a tree with just one node has extents 0 and 0, then "nothing" should
        #  have a negative extent to the right and a positive on the left, 
        #  representing a negative breadth
        return 1, -1
    leftleft, leftright = extents(tree.left)
    rightleft, rightright = extents(tree.right)
    return min(leftleft-1, rightleft+1), max(leftright-1, rightright+1)

Ширина просто разница между двумя экстентами, возвращаемыми вышеуказанной функцией, плюс 1 (для подсчета для корневого узла):

def breadth(tree):
    leftextent, rightextent = extents(tree)
    return rightextent-leftextent+1

Полный код Python с деревом примеров с 6 узлами в качестве входных данных:

from collections import namedtuple
Node =  namedtuple('Node', ['left', 'right'])

def extents(tree):
    if not tree:
        return 1, -1
    leftleft, leftright = extents(tree.left)
    rightleft, rightright = extents(tree.right)
    return min(leftleft-1, rightleft+1), max(leftright-1, rightright+1)

def breadth(tree):
    left, right = extents(tree)
    return right-left+1

# example tree as given in question
tree = Node(
    Node(
        None,
        Node(None, Node(None, Node(None, None)))
    ),
    Node(None, None)
)

print(breadth(tree)) # outputs 4
0
ответ дан trincot 17 August 2018 в 12:12
поделиться
  • 1
    if not tree: return 1, -1 Это была действительно хорошая мысль. Спасибо Трин :) – Divakar 14 July 2018 в 06:57
Другие вопросы по тегам:

Похожие вопросы: