代码之家  ›  专栏  ›  技术社区  ›  Simone

在二叉树中查找矩阵行元素

  •  0
  • Simone  · 技术社区  · 2 年前

    我正在尝试编写一个函数,该函数给定一个二进制搜索树 T 整数和矩形矩阵 M 的整数,验证是否存在一行 M 其值属于 T .
    这是我的代码:

    M = [
        [1, 2, 3],
        [4, 5, 6]
        ]
    
    class Tree:
        def __init__(self, root=None, left=None, right=None):
            self.root = root
            self.left = left
            self.rigth = right
    
    def FindRowInTree(T, M):
        if T is None:
            return False
        else:
            for r in M:
                for e in r:
                    if e == T.root and FindRowInTree(T.left, M) is True and FindRowInTree(T.right, M) is True:
                        return True
                    FindRowInTree(T.left, M) and FindRowInTree(T.right,M)
            return False
    
    t = Tree(4, Tree(5, None, None), Tree(6, None, None))
    x = FindRowInTree(t, M)
    print(x)
    

    它总是回来 False .

    我需要更改什么才能使其正常工作?

    1 回复  |  直到 2 年前
        1
  •  2
  •   Samwise    2 年前

    把问题分解成碎片。首先编写一个函数,在树中查找单个值:

    class Tree:
        def __init__(self, root=None, left=None, right=None):
            self.root = root
            self.left = left
            self.right = right
    
        def __contains__(self, value):
            return (
                self.root == value
                or self.left is not None and value in self.left
                or self.right is not None and value in self.right
            )
    

    请注意,使用 命令 二叉树,你可以让它只检查左或右,这取决于你要查找的值与根值的比较;这就是“二进制搜索”。不过,由于你的树是无序的,你只需要在每个节点上搜索两个子节点,这意味着你要遍历整个树。

    在任何情况下,一旦您有了一个查找单个值的函数,您所需要做的就是在循环中调用它:

    def find_row_in_tree(tree, matrix):
        return any(
            all(i in tree for i in row)
            for row in matrix
        )
    

    如果你想以一种更有效的方式做到这一点,无序的二叉树对你没有任何好处;我只想写一个实用函数,把它转换成更有用的东西,比如 set :

    def tree_to_set(tree):
        if tree is None:
            return set()
        return {tree.root} | tree_to_set(tree.left) | tree_to_set(tree.right)
    
    def find_row_in_tree(tree, matrix):
        tree_as_set = tree_to_set(tree)
        return any(tree_as_set.issuperset(row) for row in matrix)