从数组构造(非二进制)树

时间:2011-09-17 15:16:02

标签: java data-structures tree

我需要用Java构建一个树。我已经完成了树作为数据结构。但是我在将数据从数组提供给树时遇到了一些问题。这是我需要做的。

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

然后,树应该像:

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

所以基本上我希望节点的子节点拥有来自域的所有子节点中尚未覆盖的子节点。问题是,尽管有很多尝试,但我无法编写代码来执行此操作。我知道它可以用递归函数完成。 我不想要完整的代码。对解决方案的任何暗示都将受到高度赞赏。谢谢。

enter image description here

P.S。

我清楚说明了。 “”树中的每个节点都具有来自域的子节点的所有值,除了已经覆盖的子节点或其父节点“”

如图所示,a是基数(比如null)。它具有域(b,c)中的所有值。 b有c,c有b。

2 个答案:

答案 0 :(得分:1)

规范说:

  

树中的每个节点都具有来自域的子节点的所有值,除了已经覆盖的子节点或其父节点

有点不清楚,但我假设其中包含或其父级意味着如果值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

答案 1 :(得分:0)

您需要更清楚/准确地指定构建树的规则:

  • 根据您的原始规范,左下角的“C”节点应该有一个“A”子节点。 (你已经纠正了......我明白了。)

  • 您的规范没有说明您如何决定在根节点中放入什么内容。 (为什么图中的“A”?)

我觉得正确指定规则可以帮助您了解之前尝试过的解决方案无效的原因。如果没有,这至少可以帮助我们弄明白。

如果您正在努力遵守规则,或许您可以从语义上解释这个“树”应该代表什么。 (我怀疑它可能意味着表示输入字符串的排列。)