Построение (недвоичного) дерева из массива - PullRequest
4 голосов
/ 17 сентября 2011

Мне нужно построить дерево на Java. Я уже сделал дерево в качестве структуры данных. Но у меня возникли некоторые проблемы с передачей данных из массива в дерево. Вот что мне нужно сделать.

domain = {"b", "c"};

тогда дерево должно выглядеть так:

null -> b,c
b->c  c->b

Итак, я хочу, чтобы дочерний узел имел всех дочерних элементов из домена, которые еще не включены в родительский элемент. Проблема в том, что, несмотря на множество попыток, я не могу написать код для этого. Я знаю, что это можно сделать с помощью рекурсивной функции. Я не хочу полный код. Любая подсказка к решению будет высоко оценена. Спасибо.

enter image description here

приписка

Я бы уточнил спецификацию. "" Каждый узел в дереве имеет все значения как дочерние элементы домена, кроме тех, которые уже включены в него или его родителей ""

как на рисунке, а является основанием (скажем, ноль). Он имеет все значения из домена (b, c). b имеет c, а c имеет b.

Ответы [ 2 ]

1 голос
/ 17 сентября 2011

В спецификации сказано:

Каждый узел в дереве имеет все значения как дочерние элементы домена, за исключением тех, которые уже включены в него или его родителей

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

import List

data Tree = Tree String [Tree]

build x xs = Tree x children
    where
    children = map (\x -> build x (delete x xs)) xs

Например, учитывая корневое значение "a" и список значений домена ["b", "c", "d"], программа создает корневой узел со значением "a", а 3 дочерних элемента рекурсивно построены из:

  • корневое значение "b" и домен ["c", "d"],
  • корневое значение "c" и домен ["b", "d"],
  • и корневое значение "d" и домен ["b", "c"].

В псевдо-Python это алгоритм программы на Haskell:

def build(root_value, domain):
    node = Tree(root_value)

    # For each value in the domain:
    for i in range(len(domain)):
        child_root = domain[i]

        # The child domain is equal to the original domain
        # with value at position 'i' removed.
        child_domain = domain[: i] + domain[i + 1:]

        # Recursively build the child
        child = build(child_root, child_domain)

        # - and add the child to the node.
        node.add_child(child)

    return node

Вот тест функции build, которая печатает дерево примера вопроса и приведенного выше примера:

pretty level (Tree x children) = do
    mapM_ putStr [indent, x, "\n"]
    mapM_ (pretty (level + 3)) children
    where
    indent = replicate level ' '

main = do
    putStrLn "Tree for a -> b, c:"
    pretty 0 (build "a" ["b", "c"])
    putStrLn "\nTree for a -> b, c, d:"
    pretty 0 (build "a" ["b", "c", "d"])

Тест использует отступ, чтобы показать глубину каждого узла в дереве:

Tree for a -> b, c:
a
   b
      c
   c
      b

Tree for a -> b, c, d:
a
   b
      c
         d
      d
         c
   c
      b
         d
      d
         b
   d
      b
         c
      c
         b
0 голосов
/ 17 сентября 2011

Вам необходимо указать правила для построения дерева более четко / точно:

  • В соответствии с вашей исходной спецификацией, узел "C" в левом нижнем углу должен иметь "A""дочерний узел.(Вы исправили это ... Понятно.)

  • В вашей спецификации не сказано, как вы решаете, что поместить в корневой узел.(Почему на вашей диаграмме это «А»?)

У меня такое ощущение, что правильное указание правил поможет вам понять, почему ваши предыдущие попытки решения не сработали.Если нет, то это, по крайней мере, поможет нам понять это.

Если вы боретесь с правилами, возможно, вы могли бы объяснить, что это «дерево» должно представлять ... в семантическом смысле.(Я подозреваю, что может представлять собой представление перестановок входных строк.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...