如何解决如何使二叉树的搜索/遍历方法起作用?
我最近刚完成了自己的二叉树实现,我认为这在第一次尝试中效果很好。我可以很容易地将左右子节点添加到根节点,查看节点的值,并验证某个节点是否为子节点。
但是,我的搜索功能确实存在问题,该功能要求使用预遍历系统。在我的IDE中,使用像这样的二叉树:
尝试使用我的搜索功能的会不断返回错误“ AttributeError:'int'对象没有属性'data'” ,我不确定这是什么意思。在我的代码中:
def search(self,value):
def find(x):
if x.data is not False:
return True
val2 = self.traverse_pre_order(find)
if val2 is not True:
return False
else:
return True
我试图将x.data更改为简单的x,但这返回了AttributeError 'NoneType'对象没有属性'traverse_pre_order'。
我已经找到一个与我正在研究的二叉树相关的PasteBin with my full code链接。
解决方法
首先,由于您执行Option Explicit
Function MergedCellsCount(CriteriaRange As Range,_
Criteria As String) _
As Long
Application.Volatile
Dim c As Range
For Each c In CriteriaRange.Cells
If Not IsError(c) Then
If InStr(1,c.Value,Criteria,vbTextCompare) > 0 Then
MergedCellsCount = MergedCellsCount + c.MergeArea.Cells.Count
End If
End If
Next
End Function
,因此x.data
应该更改为x
。您的输入已经是visit(self.data)
,因此self.data
将是x
,而self.data
将等于x.data
,这没有道理。
第二,您应该在self.data.data
中更改递归条件。
应该是traverse_pre_order
而不是if self.left is not None:
。您不想检查if hasattr(self,'left'):
是否存在(因为它总是存在的,因为您在self.left
中对其进行了初始化)。相反,您应该检查它是否为__init__
。
None
和traverse_pre_order
的结构中也存在明显的错误,但我想您可以尝试自己先解决这个问题。
您的代码存在一些问题:
-
您在类定义的正下方定义了一些变量(值,left_child,right_child),但是从不使用它们。
-
清楚地考虑每种方法应该做什么。您的
traverse_pre_order
函数不会返回任何内容,因此val2
函数的search
中不会存储任何内容。
您得到了错误
-
因为您基本上调用了
find(Node.data)
,然后find函数尝试执行data.data
(不存在) -
,因为最后有一个带有
left=None
的节点,您尝试调用left.traverse_pre_order()
。您应该检查left not None
而不是使用hasattr
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。