如何在树中搜索?
How to search in a tree?
我有这个跟随树实现:
class Node:
def __init__(self, *, val):
self.val = val
def __repr__(self):
return "{}(val={})".format(type(self).__name__, self.val)
class Tree:
def __init__(self, *, val, left=None, right=None):
self.val = val
self.left = left
self.right = right
def __repr__(self):
return "{}(val={}, left={}, right={})".format(type(self).__name__, self.val, self.left, self.right)
现在我尝试添加一个方法来检查元素是否存在:
def exists(self, val):
if self.val == val:
return True
return self.left.exists(val) or self.right.exists(val)
然后,如果我尝试搜索 1
,就没问题了。但是对于 2
,它会出错。
Traceback (most recent call last):
File "...", line 30, in <module>
print(tree.exists(2))
File "...", line 20, in exists
return self.left.exists(val) or self.right.exists(val)
File "...", line 20, in exists
return self.left.exists(val) or self.right.exists(val)
AttributeError: 'Node' object has no attribute 'exists'
作为参考,这是我制作的树:
tree = Tree(val=1,
left=Tree(val=Node(val=2), left=Node(val=3), right=Node(val=4)),
right=Tree(val=Node(val=2), left=Node(val=3), right=Node(val=4)))
如何在树中递归搜索?
你递归的底部不仅是你找到了值(如果self.val == val),而且如果你到达树的叶子(如果self.isLeaf return假)
只需丢弃毫无用处的节点 class:
class Tree:
def __init__(self, *, val, left=None, right=None):
self.val = val
self.left = left
self.right = right
def exists(self, val):
if self.val == val:
return True
if self.left and self.left.exists(val):
return True
if self.right and self.right.exists(val):
return True
return False
tree = Tree(val=1,
left=Tree(val=2, left=Tree(val=3), right=Tree(val=4)),
right=Tree(val=2, left=Tree(val=3), right=Tree(val=4)))
错误说“节点”没有“存在”的方法,这是正确的。您没有编写 Node 版本的“存在”。需要弄清楚每个节点有哪些数据和方法,整个树上应该有哪些数据和方法。
但是另外,如果不检查它们是否 None,你就不能向左或向右看。
self.left.exists()
应替换为
self.left and self.left.exists()
右边也一样
我有这个跟随树实现:
class Node:
def __init__(self, *, val):
self.val = val
def __repr__(self):
return "{}(val={})".format(type(self).__name__, self.val)
class Tree:
def __init__(self, *, val, left=None, right=None):
self.val = val
self.left = left
self.right = right
def __repr__(self):
return "{}(val={}, left={}, right={})".format(type(self).__name__, self.val, self.left, self.right)
现在我尝试添加一个方法来检查元素是否存在:
def exists(self, val):
if self.val == val:
return True
return self.left.exists(val) or self.right.exists(val)
然后,如果我尝试搜索 1
,就没问题了。但是对于 2
,它会出错。
Traceback (most recent call last):
File "...", line 30, in <module>
print(tree.exists(2))
File "...", line 20, in exists
return self.left.exists(val) or self.right.exists(val)
File "...", line 20, in exists
return self.left.exists(val) or self.right.exists(val)
AttributeError: 'Node' object has no attribute 'exists'
作为参考,这是我制作的树:
tree = Tree(val=1,
left=Tree(val=Node(val=2), left=Node(val=3), right=Node(val=4)),
right=Tree(val=Node(val=2), left=Node(val=3), right=Node(val=4)))
如何在树中递归搜索?
你递归的底部不仅是你找到了值(如果self.val == val),而且如果你到达树的叶子(如果self.isLeaf return假)
只需丢弃毫无用处的节点 class:
class Tree:
def __init__(self, *, val, left=None, right=None):
self.val = val
self.left = left
self.right = right
def exists(self, val):
if self.val == val:
return True
if self.left and self.left.exists(val):
return True
if self.right and self.right.exists(val):
return True
return False
tree = Tree(val=1,
left=Tree(val=2, left=Tree(val=3), right=Tree(val=4)),
right=Tree(val=2, left=Tree(val=3), right=Tree(val=4)))
错误说“节点”没有“存在”的方法,这是正确的。您没有编写 Node 版本的“存在”。需要弄清楚每个节点有哪些数据和方法,整个树上应该有哪些数据和方法。
但是另外,如果不检查它们是否 None,你就不能向左或向右看。
self.left.exists()
应替换为
self.left and self.left.exists()
右边也一样