class KDNode:
def __init__(self,x,y,level=1):
self.x=x
self.y=y``
self.level=level
self.right=None
self.left=None
class KDtree:
def __init__(self):
self.root=None
def Insert(self,x,y):
'''插入元素,通过调用Add方法'''
if self.root==None:
self.Add(x,y,self.root)
else:
self.Add(x,y,self.root,2)
def Add(self,x,y,node,level=1):
'''为k-d树添加元素'''
if node==None:
if level!=1:
print('所创建的k-d树还未创建根节点,将自动把(%.d,%.d)设为根节点'%(x,y))
self.root=KDNode(x,y,level)
return
elif level%2!=0: #创建偶数层
if node.y>y:
if node.right==None:
node.right=KDNode(x,y,level)
return
self.Add(x,y,node.right,level+1)
elif node.y<y:
if node.left==None:
node.left=KDNode(x,y,level)
return
self.Add(x,y,node.left,level+1)
elif level%2==0: #创建奇数层
if node.x>x:
if node.right==None:
node.right=KDNode(x,y,level)
return
self.Add(x,y,node.right,level+1)
elif node.x<x:
if node.left==None:
node.left=KDNode(x,y,level)
return
self.Add(x,y,node.left,level+1)
#####################################################################################
def printKDTreeInfix(self, node):
'''中序遍历'''
if node == None:
return
self.printKDTreeInfix(node.left)
print('(%.d,%.d)'%(node.x,node.y))
self.printBTreeInfix(node.right)
def printKDTreePre(self, node):
'''先序遍历'''
if node == None:
return
print('(%.d,%.d)'%(node.x,node.y))
self.printKDTreePre(node.left)
self.printKDTreePre(node.right)
def printKDTreePost(self, node):
'''后序遍历'''
if node == None:
return
self.printKDTreePost(node.left)
self.printKDTreePost(node.right)
print('(%.d,%.d,%.d)'%(node.x,node.y,node.level))
def printKDTree(self,dire):
'''打印二叉树'''
if dire=='Infix':
self.printKDTreeInfix(self.root)
print('中根序')
elif dire=='Pre':
print('先根序')
self.printKDTreePre(self.root)
elif dire=='Post':
print('后根序')
self.printKDTreePost(self.root)
else:
print('Wrong!')
if name==‘main’:
tr=KDtree()
X_List=[40,10,70,25,80,20,35,60]
Y_List=[60,75,20,15,70,45,45,50]
for i in range(0,8):
tr.Insert(X_List[i],Y_List[i])
print('遍历方式(x,y,level)')
tr.printKDTree('Post')