繁体   English   中英

树搜索-给定树中的两个节点,检查它们是否已连接-python

Tree Search - given two nodes in a tree, check if they are connected - python

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

给定一个搜索树,例如

"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

我目前正在使用anytree库,正在努力实现该解决方案。 上图是结构上的简化。 此处概述了我目前尝试实现的功能: https : //pastebin.com/Mjk7gyqH

如果可以使用纯python或anytree给出答案,那将是很棒的,但是任何答案总比没有好。

2 个回复

您可以使用简单的递归:

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

如果我很了解,您“只是”要求直接的父子关系而没有任何中间节点。 如果这不是您想要的内容,请提供另一个示例,说明以下代码在哪里失败,我可以对其进行修复。

代码使用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()
1 检查树中的节点是否已删除

我正在使用以下代码从SapTree删除节点: 但是,有时由于权限或其他依赖性,我无法删除项目。 如何检查是否可以删除该项目? 以上所有方法都返回void ,因此没有这种反馈。 我尝试了什么? 我在文档( SapTree [MicroFocus] )中查找了一种需要键并 ...

2 在树中检查给定节点是否是另一个节点的祖先

我有一个问题-如果给定2个节点(A,B)是B的祖先,我需要回答这个问题。我知道可能的解决方案是获取进入节点的时间和离开节点的时间。 基于此,我可以快速计算关系。 如何使用DFS获得那些无法通过重复实现的“时间戳”? 我不是算法和C ++方面的专家,这就是为什么我要问。 ...

4 检查Haskell中的两个n元树是否相等

我试图在Haskell中实现一个简单的布尔函数,以检查两个n元树是否相等。 我的代码是: 我的问题是,如果我进行以下测试: 它正确返回false,因为树不相等,但是如果我尝试测试,例如: 它不起作用,因为当树相等时返回true。 你知道我在做什么错吗? ...

5 检查两个树的颜色是否相等

通过字符串给出了两种树着色。 字符串定义了从根到最后一个右孩子的树。 例如: 被定义为“ RRBBRRR”。 如果可以通过更改某些节点的子节点从初始处获得结果着色,则认为两种颜色相等。 例如,着色: 等于第一个。 问题是,给定两种颜色的字符串表示形式,如何根据规则2检查它们是 ...

7 检查是python中的树是二叉搜索树

我想编写一个函数来显示给定的树是否是 BinarySearch。 这是我到目前为止所写的: (顺便说一句,我刚刚报告了代码中感兴趣的部分)这段代码运行良好,但是当例如一个数字(大于根)在树的左侧,但它是较低的数字: 它应该给我 False,而不是它返回 True。 我能做什么? (如果 ...

9 连接树中的节点

一个假说的问题。 假设给了我一棵树T和一个T中的节点对列表(x,y)。我被问到我最多可以一次使用T中的每个边同时连接几对(将x与y连接) 。 怎么会这样呢? ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM