树搜索给定树中的两个节点,检查它们是否连接在一起

2024-10-03 00:21:37 发布

您现在位置:Python中文网/ 问答频道 /正文

给定一个搜索树,例如

"1"
 └ "2"
    ├ "2.1"
    ┊   └ "3"
    ┊
    └ "2.2"
        └ "2.2.1"
             └ "3"

以及属于该树的两个节点ab,例如“2.1”和“3”。我们如何检查ab是否是父子(或子-父)相关/连接的?你知道吗

对于第一个例子,应该得到True。还有一些:

a="3"      b="1"    -> False
a="3"      b="2"    -> False
a="2.2.1"  b="2.2"  -> True
a="2.2.1"  b="3"    -> True

我目前正在使用^{}库,我正在努力实现这个解决方案。上图是结构上的简化。我目前尝试实现的是:https://pastebin.com/Mjk7gyqH

如果答案可以用纯python或anytree给出,那就太棒了,但是任何答案都比没有好。你知道吗


Tags: 答案httpscomfalsetrue节点解决方案结构
2条回答

如果我理解的很好,你只是要求一个没有任何中间节点的直接父子关系。 如果这不是你要找的,那么请提供另一个例子,说明下面的代码失败,我可以修复它。你知道吗

代码使用anytree,因为这是您建议的库

from anytree import Node, RenderTree

nodes = {} # a dict as a lookup to find nodes by name

def add_node(val, parentval=None):
    if parentval is not None:
        node = nodes[val] = Node(val, parent=nodes[parentval])
    else:
        node = nodes[val] = Node(val)
    return node

def mk_tree():
    top = add_node("1")
    add_node("2", "1")
    add_node("2.1", "2")
    add_node("3", "2.1")
    add_node("2.2", "2")
    add_node("2.2.1", "2.2")
    add_node("3", "2.2.1")
    return top

def is_child_or_parent(n1, n2):
    return n1.parent == n2 or n2.parent == n1

testpatterns = [
    ("3", "1", False),
    ("3", "2", False),
    ("2.2.1", "2.2", True),
    ("2.2.1", "3", True),
    ]

def run_test():
    for name1, name2, expected in testpatterns:
        node1 = nodes[name1]
        node2 = nodes[name2]
        rslt = is_child_or_parent(node1, node2)
        print(node1, node2, expected, rslt)
        assert rslt == expected

tree = mk_tree()
print(RenderTree(tree))
run_test()

可以使用简单的递归:

tree = {'name': '1', 'children': [{'name': '2', 'children': [{'name': '2.1', 'children': [{'name': '3'}]}, {'name': '2.2', 'children': [{'name': '2.2.1', 'children': [{'name': '3'}]}]}]}]}
def in_tree(d, node):
   return d['name'] == node or any(in_tree(i, node) for i in d.get('children', []))

def lookup(tree, a, b, flag=False):
   if tree['name'] == b and flag:
     return True
   return any(lookup(j, a, b, tree['name'] == a) for j in tree.get('children', []))

test = [['3', '1'], ['3', '2'], ['2.2.1', '2.2'], ['2.2.1', '3'], ['60', '70']]
for a, b in test:
   if not in_tree(tree, a) or not in_tree(tree, b):
      raise AttributeError('Node(s) missing in tree')
   print(any([lookup(tree, a, b), lookup(tree, b, a)]))

输出:

False
False
True
True
Traceback (most recent call last):
  File "<stdin>", line 3, in <module>
AttributeError: Node(s) missing in tree

相关问题 更多 >