规范说明:
树中的每个节点都有来自域的所有值作为子节点,除了已经在其本身或其父节点中涵盖的值
这有点不清楚,但我假设“在其本身或其父节点中涵盖”意味着如果值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代码如下:
def build(root_value, domain):
node = Tree(root_value)
for i in range(len(domain)):
child_root = domain[i]
child_domain = domain[: i] + domain[i + 1:]
child = build(child_root, child_domain)
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
c->b
中,据我理解,父节点已经包含了b
,因此不应该有任何子节点。如果你画出了树结构的图表,它会更加清晰明了。即使你只是手工在纸上画一张图,再用手机拍照,也会更清晰。 - jeffluntb -> c -> b
。 - Mikita Belahlazau