Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 代码不工作树BFS搜索_Python_Tree_Breadth First Search - Fatal编程技术网

Python 代码不工作树BFS搜索

Python 代码不工作树BFS搜索,python,tree,breadth-first-search,Python,Tree,Breadth First Search,我编写了一个树级顺序遍历,虽然我的代码有正确的输出,但它抛出了一个 第21行:AttributeError:“非类型”对象没有属性“val” 我知道某个地方有一个值返回Null,但我找不到它的位置 # Definition for a binary tree node. # class TreeNode: # def __init__(self, x): # self.val = x # self.left = None # self.r

我编写了一个树级顺序遍历,虽然我的代码有正确的输出,但它抛出了一个

第21行:AttributeError:“非类型”对象没有属性“val”

我知道某个地方有一个值返回Null,但我找不到它的位置

# Definition for a binary tree node. 
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

import queue
class Solution(object):
    def levelOrder(self, root):
        L = queue.Queue()
        local = []
        result = []
        L.put(root)
        counter = 0
        while not L.empty():
            counter = L.qsize()
            local = []
            while counter >0:
                node = L.get()
                local.append(node.val)
                if(node.left):
                    L.put(node.left)
                if(node.right):
                    L.put(node.right)
                counter -=1
            result.append(local)   
        return result

如果您试图实现真正的广度优先搜索,可以使用
getattr
简化解决方案,以处理树叶(
left
right
属性存储
None
),并使用
collections.deque
简化两端的元素访问。请注意,
collections.deque
包含一个
\uuu bool\uu
方法,因此,在
while
循环中不需要显式的大小比较。出于演示目的,下面的代码创建了一个完整的二叉树,其中包含用于答案验证的
\uuu repr\uu
方法,然后提供解决方案类。此外,如类似问题中所述,要查找树级顺序,可以使用递归获得更简单的结果:

二叉树实现:

import collections, random
class Tree:
  full_nodes = []
  def __init__(self, **kwargs):
     self.__dict__ = {i:kwargs.get(i) for i in ['left', 'right', 'value']}
     Tree.full_nodes.append(kwargs.get('value'))
  def __bool__(self):
     return bool(getattr(self, 'value'))
  def __lt__(self, _node):
    return self.value < getattr(_node, 'value', _node)
  def insert_val(self, val):
    if self.value is None:
       self.value = val
    else:
       if val < self.value:
         if self.left is None:
           self.left = Tree(value = val)
         else:
           self.left.insert_val(val)
       else:
         if self.right is None:
           self.right = Tree(value = val)
         else: 
           self.right.insert_val(val)
  def __repr__(self):
    return f'<tree storing nodes {list(filter(None, Tree.full_nodes))}>'
  @classmethod
  def load_tree(cls, num=10, bounds = [1, 100]):
     _t = cls()
     for i in range(num):
        _t.insert_val(random.choice(range(*bounds)))
     return _t

运行解决方案:

t = Tree.load_tree()
>>>t
 <tree storing nodes [10, 82, 17, 25, 78, 93, 64, 53, 74]>
>>>Solution.bfs(t, 10), Solution.bfs(t, 200)
(True, False)
>>>list(Solution.pretty_nested(t))
[[42], [[10], [[17], [[25], []]], [82], [[78], [[64], [[53], [], [74], []]], [93], []]]]
t=Tree.load_Tree()
>>>t
>>>溶液bfs(t,10),溶液bfs(t,200)
(对,错)
>>>列表(解决方案。漂亮的嵌套(t))
[[42], [[10], [[17], [[25], []]], [82], [[78], [[64], [[53], [], [74], []]], [93], []]]]

您的问题看起来像是LeetCode中的算法问题。您是否尝试过调试它?您的代码段不完整,因为您没有显示如何调用方法
levelOrder
,也没有显示
root
的值或
解决方案的内容。请显示完整的代码片段,我们可以复制、粘贴并自行运行,并显示您的问题。
t = Tree.load_tree()
>>>t
 <tree storing nodes [10, 82, 17, 25, 78, 93, 64, 53, 74]>
>>>Solution.bfs(t, 10), Solution.bfs(t, 200)
(True, False)
>>>list(Solution.pretty_nested(t))
[[42], [[10], [[17], [[25], []]], [82], [[78], [[64], [[53], [], [74], []]], [93], []]]]