fromcollectionsimportnamedtuplefromoperatorimportitemgetterfrompprintimportpformatclassNode(namedtuple('Node','locationleft_childright_child')):def__repr__(self):returnpformat(tuple(self))defkdtree(point_list,depth=0):try:k=len(point_list[0])#assumesallpointshavethesamedimensionexceptIndexErrorase:#ifnotpoint_list:returnNone#Selectaxisbasedondepthsothataxiscyclesthroughallvalidvaluesaxis=depth%k#Sortpointlistandchoosemedianaspivotelementpoint_list.sort(key=itemgetter(axis))median=len(point_list)//2#choosemedian#CreatenodeandconstructsubtreesreturnNode(location=point_list[median],left_child=kdtree(point_list[:median],depth+1),right_child=kdtree(point_list[median+1:],depth+1))defmain():"""Exampleusage"""point_list=[(2,3),(5,4),(9,6),(4,7),(8,1),(7,2)]tree=kdtree(point_list)print(tree)if__name__=='__main__':main()输出如下:((7,2),((5,4),((2,3),None,None),((4,7),None,None)),((9,6),((8,1),None,None),None))
KD树/KD树
THE END