Python 代码不工作树BFS搜索
我编写了一个树级顺序遍历,虽然我的代码有正确的输出,但它抛出了一个 第21行:AttributeError:“非类型”对象没有属性“val” 我知道某个地方有一个值返回Null,但我找不到它的位置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
# 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], []]]]