- 개발자 : 나휘동
- TDD를 쓰긴 썼는데, 테스트가 영 마음에 들지 않는다. 후...
- 다 만들고서 리펙토링을 했다.
=== Before Refactoring ===
class BinartSearchTree:
def __init__(self):
self.root = Node()
def makeChildren(self, aRoot):
aRoot.left = Node()
aRoot.right = Node()
def setNode(self, aNode, aKey):
aNode.setKey(aKey)
def getNode(self, aNode, aKey):
if aNode.key == aKey or aNode.key == -1:
return aNode
elif aNode.key > aKey:
return self.getNode( aNode.left, aKey )
else:
return self.getNode( aNode.right, aKey )
def search(self, aRoot, aKey):
if aRoot == None or aRoot.key == -1:
return False
elif aRoot.key == aKey:
return True
elif aRoot.key > aKey:
return self.search( aRoot.left, aKey )
else:
return self.search( aRoot.right, aKey )
def insert(self, aRoot, aKey):
if self.search( aRoot, aKey ) == False:
node = self.getNode(aRoot, aKey)
self.setNode( node, aKey )
self.makeChildren( node )
return True
return False
def delete(self, aRoot, aKey):
if self.search( aRoot, aKey ) == True:
node = self.getNode(aRoot, aKey)
## if self.getNumofChildren( node ) == 0:
## self.setNode(node, -1)
## elif self.getNumofChildren( node ) == 1:
## child = self.getSingleChild(node)
## self.replace(node, child)
if node.numofChildren() == 0:
self.setNode(node, -1)
elif node.numofChildren() == 1:
child = self.getSingleChild(node)
self.replace(node, child)
else:
largest = self.getLargest( node.left )
child = self.getSingleChild( largest )
self.setNode( node, largest.key )
self.replace( largest, child )
return True
return False
def getNumofChildren( self, aNode ):
count = 0
if aNode.left.key != -1:
count += 1
if aNode.right.key != -1:
count += 1
return count
def getSingleChild( self, aNode ):
if aNode.left.key != -1 and aNode.right.key != -1:
return None
elif aNode.left.key != -1:
return aNode.left
else:
return aNode.right
def replace( self, aRoot, aChild ):
aRoot.key = aChild.key
aRoot.left = aChild.left
aRoot.right = aChild.right
def getLargest( self, aRoot ):
node = aRoot
while ( aRoot.right.key != -1 ):
node = aRoot.right
aRoot = aRoot.right
return node
class Node:
def __init__(self, aKey = -1):
self.setKey(aKey)
self.left = None
self.right = None
def setKey(self, aKey):
self.key = aKey
def numofChildren(self):
count = 0
if self.left.key != -1:
count += 1
if self.right.key != -1:
count += 1
return count
#########################################################################
import unittest
class BinartSearchTreeTestCase(unittest.TestCase):
def testMakeChildren(self):
bst = BinartSearchTree()
self.assertEquals(bst.root.left, None)
self.assertEquals(bst.root.right, None)
bst.makeChildren(bst.root)
self.assertNotEquals(bst.root.left, None)
self.assertNotEquals(bst.root.right, None)
def testSearch(self):
bst = BinartSearchTree()
bst.makeChildren(bst.root)
bst.setNode(bst.root, 2)
bst.setNode(bst.root.left, 1)
bst.setNode(bst.root.right, 3)
self.assertEquals(bst.search(bst.root, 1), True)
self.assertEquals(bst.search(bst.root, 5), False)
def testInsert(self):
bst = BinartSearchTree()
bst.makeChildren(bst.root)
bst.setNode(bst.root, 2)
bst.insert(bst.root, 1)
self.assertEquals(bst.search(bst.root, 1), True)
self.assertEquals(bst.insert(bst.root, 1), False)
bst.insert(bst.root, 5)
self.assertEquals(bst.search(bst.root, 5), True)
## def testGetNumofChildren(self):
## bst = BinartSearchTree()
## bst.makeChildren(bst.root)
## bst.setNode(bst.root, 20)
##
## bst.insert(bst.root, 10)
## bst.insert(bst.root, 5)
## bst.insert(bst.root, 25)
## bst.insert(bst.root, 22)
##
## self.assertEquals(bst.getNumofChildren( bst.root ), 2 )
def testGetSingleChild(self):
bst = BinartSearchTree()
bst.makeChildren(bst.root)
bst.setNode(bst.root, 20)
bst.insert(bst.root, 10)
bst.insert(bst.root, 5)
bst.insert(bst.root, 25)
self.assertEquals(bst.getSingleChild( bst.root), None)
self.assertEquals(bst.getSingleChild( bst.root.left).key, 5)
def testReplace(self):
bst = BinartSearchTree()
bst.makeChildren(bst.root)
bst.setNode(bst.root, 20)
bst.insert(bst.root, 10)
root = bst.root
child = bst.getSingleChild( bst.root )
bst.replace( root, child )
self.assertEquals( bst.root.key , 10 )
self.assertEquals( bst.root.left.key , -1 )
self.assertEquals( bst.root.left.left , None )
def testGetLargest(self):
bst = BinartSearchTree()
bst.makeChildren(bst.root)
bst.setNode(bst.root, 20)
bst.insert(bst.root, 22)
bst.insert(bst.root, 21)
bst.insert(bst.root, 25)
self.assertEquals( bst.getLargest( bst.root ).key, 25 )
def testDelete(self):
bst = BinartSearchTree()
bst.makeChildren(bst.root)
bst.setNode(bst.root, 20)
bst.insert(bst.root, 10)
bst.insert(bst.root, 5)
bst.insert(bst.root, 25)
bst.insert(bst.root, 22)
self.assertEquals(bst.delete(bst.root, 11), False)
self.assertEquals(bst.delete(bst.root, 5), True)
self.assertEquals(bst.search(bst.root, 5), False)
####################################################################
self.assertEquals(bst.delete(bst.root, 25), True)
self.assertEquals(bst.search(bst.root, 25), False)
self.assertEquals( bst.root.key , 20 )
self.assertEquals( bst.root.left.key , 10 )
self.assertEquals( bst.root.right.key , 22)
####################################################################
self.assertEquals( bst.delete( bst.root, 20 ), True )
self.assertEquals( bst.search( bst.root, 20 ), False )
self.assertEquals( bst.root.key, 10)
self.assertEquals( bst.root.right.key, 22)
self.assertEquals( bst.root.left.key, -1)
if __name__ == '__main__':
unittest.main()
=== After Rafactoring ===
class BinartSearchTree:
def __init__(self):
self.root = Node()
def makeChildren(self, aRoot):
aRoot.left = Node()
aRoot.right = Node()
def getNode(self, aNode, aKey):
if aNode.key == aKey or aNode.key == -1:
return aNode
elif aNode.key > aKey:
return self.getNode( aNode.left, aKey )
else:
return self.getNode( aNode.right, aKey )
def search(self, aRoot, aKey):
if aRoot == None or aRoot.key == -1:
return False
elif aRoot.key == aKey:
return True
elif aRoot.key > aKey:
return self.search( aRoot.left, aKey )
else:
return self.search( aRoot.right, aKey )
def insert(self, aRoot, aKey):
if self.search( aRoot, aKey ) == False:
node = self.getNode(aRoot, aKey)
node.setNode( aKey )
self.makeChildren( node )
return True
return False
def delete(self, aRoot, aKey):
if self.search( aRoot, aKey ) == True:
node = self.getNode(aRoot, aKey)
if node.numofChildren() == 0:
node.setNode( -1 )
elif node.numofChildren() == 1:
child = node.getSingleChild()
node.replace( child )
else:
largest = node.left.getLargest()
child = largest.getSingleChild()
node.setNode( largest.key )
largest.replace( child )
return True
return False
class Node:
def __init__(self, aKey = -1):
self.setNode(aKey)
self.left = None
self.right = None
def setNode(self, aKey):
self.key = aKey
def numofChildren(self):
count = 0
if self.left.key != -1:
count += 1
if self.right.key != -1:
count += 1
return count
def getSingleChild(self):
if self.left.key != -1 and self.right.key != -1:
return None
elif self.left.key != -1:
return self.left
else:
return self.right
def replace(self, aNode):
self.key = aNode.key
self.left = aNode.left
self.right = aNode.right
def getLargest( self ):
node = self
right = self.right
while ( right.key != -1 ):
node = self.right
right = right.right
return node
#########################################################################
import unittest
class BinartSearchTreeTestCase(unittest.TestCase):
def testMakeChildren(self):
bst = BinartSearchTree()
self.assertEquals(bst.root.left, None)
self.assertEquals(bst.root.right, None)
bst.makeChildren(bst.root)
self.assertNotEquals(bst.root.left, None)
self.assertNotEquals(bst.root.right, None)
def testSearch(self):
bst = BinartSearchTree()
bst.makeChildren(bst.root)
bst.root.setNode( 2 )
bst.root.left.setNode( 1 )
bst.root.right.setNode( 3 )
self.assertEquals(bst.search(bst.root, 1), True)
self.assertEquals(bst.search(bst.root, 5), False)
def testInsert(self):
bst = BinartSearchTree()
bst.makeChildren(bst.root)
bst.root.setNode( 2 )
bst.insert(bst.root, 1)
self.assertEquals(bst.search(bst.root, 1), True)
self.assertEquals(bst.insert(bst.root, 1), False)
bst.insert(bst.root, 5)
self.assertEquals(bst.search(bst.root, 5), True)
def testDelete(self):
bst = BinartSearchTree()
bst.makeChildren(bst.root)
bst.root.setNode( 20 )
bst.insert(bst.root, 10)
bst.insert(bst.root, 5)
bst.insert(bst.root, 25)
bst.insert(bst.root, 22)
self.assertEquals(bst.delete(bst.root, 11), False)
self.assertEquals(bst.delete(bst.root, 5), True)
self.assertEquals(bst.search(bst.root, 5), False)
####################################################################
self.assertEquals(bst.delete(bst.root, 25), True)
self.assertEquals(bst.search(bst.root, 25), False)
self.assertEquals( bst.root.key , 20 )
self.assertEquals( bst.root.left.key , 10 )
self.assertEquals( bst.root.right.key , 22)
####################################################################
self.assertEquals( bst.delete( bst.root, 20 ), True )
self.assertEquals( bst.search( bst.root, 20 ), False )
self.assertEquals( bst.root.key, 10)
self.assertEquals( bst.root.right.key, 22)
self.assertEquals( bst.root.left.key, -1)
if __name__ == '__main__':
unittest.main()