我编写了一个脚本,通过this文章之后的离散区间编码树(饮食)来表示正整数,并且我目前正在运行测试(使用 unittest )。
class node:
def __init__(self,n_Left=None,n_Right=None,LeftChild_=None,RightChild_=None):
self.interval=[min(n_Left,n_Right),max(n_Left,n_Right)]
self.RightChild=RightChild_
self.LeftChild=LeftChild_
def length(self):
if (self.interval,self.LeftChild,self.RightChild)==([None,None],None,None):
raise EmptyNode()
return self.interval[1]-self.interval[0]+1
class diet:
def __init__(self,root_=None):
self.root=root_
def member(self,saught_value):
node_=self.root #a node instance
if node_==None: return False
if (saught_value>=(node_.interval)[0]) and (saught_value<=(node_.interval)[1]):
return True
if saught_value<(node_.interval)[0]:
L=diet(node_.LeftChild)
return L.member(saught_value)
R=diet(node_.RightChild)
return R.member(saught_value)
def append(self,value):
if self.member(value):
return self
node_=self.root
if node_==None:
return diet(node(value,value))
right_child=node_.RightChild
left_child=node_.LeftChild
if value<(node_.interval)[0] :
if value+1==(node_.interval)[0] :
Root=node(value,(node_.interval)[1],left_child,right_child)
return joinLeft(diet(Root))
else:
subtree=diet(left_child)
Root=node((node_.interval)[0],(node_.interval)[1],subtree.append(value),right_child)
return diet(Root)
if value >(node_.interval)[1]:
if value==(node_.interval)[1]+1:
Root=node((node_.interval)[0],value,left_child,right_child)
return joinRight(diet(Root))
else:
subtree=diet(right_child )
Root=node((node_.interval)[0],(node_.interval)[1],left_child,subtree.append(value))
return diet(Root)
#TEST
max_number_of_nodes=20
maximum=100
minimum=0
class Tests_Cases(unittest.TestCase):
def setUp(self):
self.number_of_nodes=random.randint(0,max_number_of_nodes)
self.nLeft=random.randint(minimum,maximum)
self.nRight=random.randint(minimum,maximum)
self.root=node(self.nLeft,self.nRight)
self.tree=diet(self.root)
self.values=[]
for i in range(max_number_of_nodes-1):
(self.values).append(random.randint(minimum,maximum))
def test_member(self):
x=random.randint(minimum,maximum)
self.assertFalse(diet().member(x))
self.assertTrue(((self.tree).member(self.nLeft))&((self.tree).member(self.nRight)))
for v in self.values:
self.tree=(self.tree).append(v)
for v in self.values:
self.assertTrue((self.tree).member(v))
当我运行测试时,我有一个错误。这是追溯:
ERROR: test_member (__main__.Tests_Cases)
----------------------------------------------------------------------
Traceback (most recent call last):
File "script.py", line 155, in test_member
self.tree=(self.tree).append(v)
File "script.py", line 101, in append
if self.member(value):
File "script.py", line 96, in member
return R.member(saught_value)
File "script.py", line 90, in member
if (saught_value>=(node_.interval)[0]) and (saught_value<=(node_.interval)[1]):
AttributeError: diet instance has no attribute 'interval'
我无法通过运行R.member(saught_value)
并测试 if 条件来了解原因,因此将node_
视为饮食的一个实例:我明确提出了member
定义的第一行node_=self.root
,它应该是 node 的一个实例。