<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://mediawiki.zeropage.org/index.php?action=history&amp;feed=atom&amp;title=%EB%AA%B8%EC%A7%B1%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8%2FBinarySearchTree</id>
	<title>몸짱프로젝트/BinarySearchTree - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://mediawiki.zeropage.org/index.php?action=history&amp;feed=atom&amp;title=%EB%AA%B8%EC%A7%B1%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8%2FBinarySearchTree"/>
	<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=%EB%AA%B8%EC%A7%B1%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8/BinarySearchTree&amp;action=history"/>
	<updated>2026-05-15T04:28:50Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.8</generator>
	<entry>
		<id>https://mediawiki.zeropage.org/index.php?title=%EB%AA%B8%EC%A7%B1%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8/BinarySearchTree&amp;diff=50466&amp;oldid=prev</id>
		<title>imported&gt;Unknown at 05:29, 7 February 2021</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=%EB%AA%B8%EC%A7%B1%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8/BinarySearchTree&amp;diff=50466&amp;oldid=prev"/>
		<updated>2021-02-07T05:29:28Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| __TOC__&lt;br /&gt;
|}&lt;br /&gt;
== Python version ==&lt;br /&gt;
* 개발자 : 나휘동&lt;br /&gt;
* TDD를 쓰긴 썼는데, 테스트가 영 마음에 들지 않는다. 후...&lt;br /&gt;
* 다 만들고서 리펙토링을 했다.&lt;br /&gt;
 === Before Refactoring ===&lt;br /&gt;
 class BinartSearchTree:&lt;br /&gt;
     def __init__(self):&lt;br /&gt;
         self.root = Node()&lt;br /&gt;
     def makeChildren(self, aRoot):&lt;br /&gt;
         aRoot.left = Node()&lt;br /&gt;
         aRoot.right = Node()&lt;br /&gt;
     def setNode(self, aNode, aKey):&lt;br /&gt;
         aNode.setKey(aKey)&lt;br /&gt;
     def getNode(self, aNode, aKey):&lt;br /&gt;
         if aNode.key == aKey or aNode.key == -1:&lt;br /&gt;
             return aNode&lt;br /&gt;
         elif aNode.key &amp;amp;gt; aKey:&lt;br /&gt;
             return self.getNode( aNode.left, aKey )&lt;br /&gt;
         else:&lt;br /&gt;
             return self.getNode( aNode.right, aKey )&lt;br /&gt;
         &lt;br /&gt;
     def search(self, aRoot, aKey):&lt;br /&gt;
         if aRoot == None or aRoot.key == -1:&lt;br /&gt;
             return False&lt;br /&gt;
         elif aRoot.key == aKey:&lt;br /&gt;
             return True&lt;br /&gt;
         elif aRoot.key &amp;amp;gt; aKey:&lt;br /&gt;
             return self.search( aRoot.left, aKey )&lt;br /&gt;
         else:&lt;br /&gt;
             return self.search( aRoot.right, aKey )&lt;br /&gt;
 &lt;br /&gt;
     def insert(self, aRoot, aKey):&lt;br /&gt;
         if self.search( aRoot, aKey ) == False:&lt;br /&gt;
             node = self.getNode(aRoot, aKey)&lt;br /&gt;
             self.setNode( node, aKey )&lt;br /&gt;
             self.makeChildren( node )&lt;br /&gt;
             return True&lt;br /&gt;
         return False&lt;br /&gt;
 &lt;br /&gt;
     def delete(self, aRoot, aKey):&lt;br /&gt;
         if self.search( aRoot, aKey ) == True:&lt;br /&gt;
             node = self.getNode(aRoot, aKey)&lt;br /&gt;
 ##            if self.getNumofChildren( node ) == 0:&lt;br /&gt;
 ##                self.setNode(node, -1)&lt;br /&gt;
 ##            elif self.getNumofChildren( node ) == 1:&lt;br /&gt;
 ##                child = self.getSingleChild(node)&lt;br /&gt;
 ##                self.replace(node, child)&lt;br /&gt;
 &lt;br /&gt;
             if node.numofChildren() == 0:&lt;br /&gt;
                 self.setNode(node, -1)&lt;br /&gt;
             elif node.numofChildren() == 1:&lt;br /&gt;
                 child = self.getSingleChild(node)&lt;br /&gt;
                 self.replace(node, child)&lt;br /&gt;
             else:&lt;br /&gt;
                 largest = self.getLargest( node.left )&lt;br /&gt;
                 child = self.getSingleChild( largest )&lt;br /&gt;
                 self.setNode( node, largest.key )&lt;br /&gt;
                 self.replace( largest, child )&lt;br /&gt;
             return True&lt;br /&gt;
         return False&lt;br /&gt;
 &lt;br /&gt;
     def getNumofChildren( self, aNode ):&lt;br /&gt;
         count = 0&lt;br /&gt;
         if aNode.left.key != -1:&lt;br /&gt;
             count += 1&lt;br /&gt;
         if aNode.right.key != -1:&lt;br /&gt;
             count += 1&lt;br /&gt;
         return count&lt;br /&gt;
 &lt;br /&gt;
     def getSingleChild( self, aNode ):&lt;br /&gt;
         if aNode.left.key != -1 and aNode.right.key != -1:&lt;br /&gt;
             return None&lt;br /&gt;
         elif aNode.left.key != -1:&lt;br /&gt;
             return aNode.left&lt;br /&gt;
         else:&lt;br /&gt;
             return aNode.right&lt;br /&gt;
 &lt;br /&gt;
     def replace( self, aRoot, aChild ):&lt;br /&gt;
         aRoot.key = aChild.key&lt;br /&gt;
         aRoot.left = aChild.left&lt;br /&gt;
         aRoot.right = aChild.right&lt;br /&gt;
         &lt;br /&gt;
     def getLargest( self, aRoot ):&lt;br /&gt;
         node = aRoot&lt;br /&gt;
         while ( aRoot.right.key != -1 ):&lt;br /&gt;
             node = aRoot.right&lt;br /&gt;
             aRoot = aRoot.right&lt;br /&gt;
         return node&lt;br /&gt;
         &lt;br /&gt;
         &lt;br /&gt;
 class Node:&lt;br /&gt;
     def __init__(self, aKey = -1):&lt;br /&gt;
         self.setKey(aKey)&lt;br /&gt;
         self.left = None&lt;br /&gt;
         self.right = None&lt;br /&gt;
     def setKey(self, aKey):&lt;br /&gt;
         self.key = aKey&lt;br /&gt;
     def numofChildren(self):&lt;br /&gt;
         count = 0&lt;br /&gt;
         if self.left.key != -1:&lt;br /&gt;
             count += 1&lt;br /&gt;
         if self.right.key != -1:&lt;br /&gt;
             count += 1&lt;br /&gt;
         return count&lt;br /&gt;
         &lt;br /&gt;
 #########################################################################&lt;br /&gt;
             &lt;br /&gt;
 import unittest&lt;br /&gt;
 &lt;br /&gt;
 class BinartSearchTreeTestCase(unittest.TestCase):&lt;br /&gt;
     def testMakeChildren(self):&lt;br /&gt;
         bst = BinartSearchTree()&lt;br /&gt;
         self.assertEquals(bst.root.left, None)&lt;br /&gt;
         self.assertEquals(bst.root.right, None)&lt;br /&gt;
         &lt;br /&gt;
         bst.makeChildren(bst.root)&lt;br /&gt;
         self.assertNotEquals(bst.root.left, None)&lt;br /&gt;
         self.assertNotEquals(bst.root.right, None)&lt;br /&gt;
 &lt;br /&gt;
     def testSearch(self):&lt;br /&gt;
         bst = BinartSearchTree()&lt;br /&gt;
         bst.makeChildren(bst.root)&lt;br /&gt;
         bst.setNode(bst.root, 2)&lt;br /&gt;
         bst.setNode(bst.root.left, 1)&lt;br /&gt;
         bst.setNode(bst.root.right, 3)&lt;br /&gt;
 &lt;br /&gt;
         self.assertEquals(bst.search(bst.root, 1), True)&lt;br /&gt;
         self.assertEquals(bst.search(bst.root, 5), False)&lt;br /&gt;
 &lt;br /&gt;
     def testInsert(self):&lt;br /&gt;
         bst = BinartSearchTree()&lt;br /&gt;
         bst.makeChildren(bst.root)&lt;br /&gt;
         bst.setNode(bst.root, 2)&lt;br /&gt;
 &lt;br /&gt;
         bst.insert(bst.root, 1)&lt;br /&gt;
         self.assertEquals(bst.search(bst.root, 1), True)&lt;br /&gt;
         self.assertEquals(bst.insert(bst.root, 1), False)&lt;br /&gt;
 &lt;br /&gt;
         bst.insert(bst.root, 5)&lt;br /&gt;
         self.assertEquals(bst.search(bst.root, 5), True)&lt;br /&gt;
 &lt;br /&gt;
 ##    def testGetNumofChildren(self):&lt;br /&gt;
 ##        bst = BinartSearchTree()&lt;br /&gt;
 ##        bst.makeChildren(bst.root)&lt;br /&gt;
 ##        bst.setNode(bst.root, 20)&lt;br /&gt;
 ##&lt;br /&gt;
 ##        bst.insert(bst.root, 10)&lt;br /&gt;
 ##        bst.insert(bst.root, 5)&lt;br /&gt;
 ##        bst.insert(bst.root, 25)&lt;br /&gt;
 ##        bst.insert(bst.root, 22)&lt;br /&gt;
 ##&lt;br /&gt;
 ##        self.assertEquals(bst.getNumofChildren( bst.root ), 2 )&lt;br /&gt;
 &lt;br /&gt;
     def testGetSingleChild(self):&lt;br /&gt;
         bst = BinartSearchTree()&lt;br /&gt;
         bst.makeChildren(bst.root)&lt;br /&gt;
         bst.setNode(bst.root, 20)&lt;br /&gt;
 &lt;br /&gt;
         bst.insert(bst.root, 10)&lt;br /&gt;
         bst.insert(bst.root, 5)&lt;br /&gt;
         bst.insert(bst.root, 25)&lt;br /&gt;
 &lt;br /&gt;
         self.assertEquals(bst.getSingleChild( bst.root), None)&lt;br /&gt;
         self.assertEquals(bst.getSingleChild( bst.root.left).key, 5)&lt;br /&gt;
 &lt;br /&gt;
     def testReplace(self):&lt;br /&gt;
         bst = BinartSearchTree()&lt;br /&gt;
         bst.makeChildren(bst.root)&lt;br /&gt;
         bst.setNode(bst.root, 20)&lt;br /&gt;
         bst.insert(bst.root, 10)&lt;br /&gt;
 &lt;br /&gt;
         root = bst.root&lt;br /&gt;
         child = bst.getSingleChild( bst.root )&lt;br /&gt;
         bst.replace( root, child )&lt;br /&gt;
         &lt;br /&gt;
         self.assertEquals( bst.root.key , 10 )&lt;br /&gt;
         self.assertEquals( bst.root.left.key , -1 )&lt;br /&gt;
         self.assertEquals( bst.root.left.left , None )&lt;br /&gt;
 &lt;br /&gt;
     def testGetLargest(self):&lt;br /&gt;
         bst = BinartSearchTree()&lt;br /&gt;
         bst.makeChildren(bst.root)&lt;br /&gt;
         bst.setNode(bst.root, 20)&lt;br /&gt;
         bst.insert(bst.root, 22)&lt;br /&gt;
         bst.insert(bst.root, 21)&lt;br /&gt;
         bst.insert(bst.root, 25)&lt;br /&gt;
 &lt;br /&gt;
         self.assertEquals( bst.getLargest( bst.root ).key, 25 )&lt;br /&gt;
         &lt;br /&gt;
     def testDelete(self):&lt;br /&gt;
         bst = BinartSearchTree()&lt;br /&gt;
         bst.makeChildren(bst.root)&lt;br /&gt;
         bst.setNode(bst.root, 20)&lt;br /&gt;
 &lt;br /&gt;
         bst.insert(bst.root, 10)&lt;br /&gt;
         bst.insert(bst.root, 5)&lt;br /&gt;
         bst.insert(bst.root, 25)&lt;br /&gt;
         bst.insert(bst.root, 22)&lt;br /&gt;
 &lt;br /&gt;
         self.assertEquals(bst.delete(bst.root, 11), False)&lt;br /&gt;
 &lt;br /&gt;
         self.assertEquals(bst.delete(bst.root, 5), True)&lt;br /&gt;
         self.assertEquals(bst.search(bst.root, 5), False)&lt;br /&gt;
 ####################################################################&lt;br /&gt;
         self.assertEquals(bst.delete(bst.root, 25), True)&lt;br /&gt;
         self.assertEquals(bst.search(bst.root, 25), False)&lt;br /&gt;
 &lt;br /&gt;
         self.assertEquals( bst.root.key , 20 )&lt;br /&gt;
         self.assertEquals( bst.root.left.key , 10 )&lt;br /&gt;
         self.assertEquals( bst.root.right.key , 22)&lt;br /&gt;
 ####################################################################&lt;br /&gt;
         self.assertEquals( bst.delete( bst.root, 20 ), True )&lt;br /&gt;
         self.assertEquals( bst.search( bst.root, 20 ), False )&lt;br /&gt;
 &lt;br /&gt;
         self.assertEquals( bst.root.key, 10)&lt;br /&gt;
         self.assertEquals( bst.root.right.key, 22)&lt;br /&gt;
         self.assertEquals( bst.root.left.key, -1)&lt;br /&gt;
         &lt;br /&gt;
 if __name__ == &amp;#039;__main__&amp;#039;: &lt;br /&gt;
     unittest.main()   &lt;br /&gt;
 === After Rafactoring ===&lt;br /&gt;
 class BinartSearchTree:&lt;br /&gt;
     def __init__(self):&lt;br /&gt;
         self.root = Node()&lt;br /&gt;
     def makeChildren(self, aRoot):&lt;br /&gt;
         aRoot.left = Node()&lt;br /&gt;
         aRoot.right = Node()&lt;br /&gt;
     def getNode(self, aNode, aKey):&lt;br /&gt;
         if aNode.key == aKey or aNode.key == -1:&lt;br /&gt;
             return aNode&lt;br /&gt;
         elif aNode.key &amp;amp;gt; aKey:&lt;br /&gt;
             return self.getNode( aNode.left, aKey )&lt;br /&gt;
         else:&lt;br /&gt;
             return self.getNode( aNode.right, aKey )&lt;br /&gt;
         &lt;br /&gt;
     def search(self, aRoot, aKey):&lt;br /&gt;
         if aRoot == None or aRoot.key == -1:&lt;br /&gt;
             return False&lt;br /&gt;
         elif aRoot.key == aKey:&lt;br /&gt;
             return True&lt;br /&gt;
         elif aRoot.key &amp;amp;gt; aKey:&lt;br /&gt;
             return self.search( aRoot.left, aKey )&lt;br /&gt;
         else:&lt;br /&gt;
             return self.search( aRoot.right, aKey )&lt;br /&gt;
 &lt;br /&gt;
     def insert(self, aRoot, aKey):&lt;br /&gt;
         if self.search( aRoot, aKey ) == False:&lt;br /&gt;
             node = self.getNode(aRoot, aKey)&lt;br /&gt;
             node.setNode( aKey )&lt;br /&gt;
             self.makeChildren( node )&lt;br /&gt;
             return True&lt;br /&gt;
         return False&lt;br /&gt;
 &lt;br /&gt;
     def delete(self, aRoot, aKey):&lt;br /&gt;
         if self.search( aRoot, aKey ) == True:&lt;br /&gt;
             node = self.getNode(aRoot, aKey)&lt;br /&gt;
             if node.numofChildren() == 0:&lt;br /&gt;
                 node.setNode( -1 )&lt;br /&gt;
             elif node.numofChildren() == 1:&lt;br /&gt;
                 child = node.getSingleChild()&lt;br /&gt;
                 node.replace( child )&lt;br /&gt;
             else:&lt;br /&gt;
                 largest = node.left.getLargest()&lt;br /&gt;
                 child = largest.getSingleChild()&lt;br /&gt;
                 node.setNode( largest.key )&lt;br /&gt;
                 largest.replace( child )&lt;br /&gt;
             return True&lt;br /&gt;
         return False&lt;br /&gt;
         &lt;br /&gt;
 class Node:&lt;br /&gt;
     def __init__(self, aKey = -1):&lt;br /&gt;
         self.setNode(aKey)&lt;br /&gt;
         self.left = None&lt;br /&gt;
         self.right = None&lt;br /&gt;
     def setNode(self, aKey):&lt;br /&gt;
         self.key = aKey&lt;br /&gt;
     def numofChildren(self):&lt;br /&gt;
         count = 0&lt;br /&gt;
         if self.left.key != -1:&lt;br /&gt;
             count += 1&lt;br /&gt;
         if self.right.key != -1:&lt;br /&gt;
             count += 1&lt;br /&gt;
         return count&lt;br /&gt;
 &lt;br /&gt;
     def getSingleChild(self):&lt;br /&gt;
         if self.left.key != -1 and self.right.key != -1:&lt;br /&gt;
             return None&lt;br /&gt;
         elif self.left.key != -1:&lt;br /&gt;
             return self.left&lt;br /&gt;
         else:&lt;br /&gt;
             return self.right&lt;br /&gt;
 &lt;br /&gt;
     def replace(self, aNode):&lt;br /&gt;
         self.key = aNode.key&lt;br /&gt;
         self.left = aNode.left&lt;br /&gt;
         self.right = aNode.right&lt;br /&gt;
 &lt;br /&gt;
     def getLargest( self ):&lt;br /&gt;
         node = self&lt;br /&gt;
         right = self.right&lt;br /&gt;
         while ( right.key != -1 ):&lt;br /&gt;
             node = self.right&lt;br /&gt;
             right = right.right&lt;br /&gt;
         return node&lt;br /&gt;
     &lt;br /&gt;
 #########################################################################&lt;br /&gt;
             &lt;br /&gt;
 import unittest&lt;br /&gt;
 &lt;br /&gt;
 class BinartSearchTreeTestCase(unittest.TestCase):&lt;br /&gt;
     def testMakeChildren(self):&lt;br /&gt;
         bst = BinartSearchTree()&lt;br /&gt;
         self.assertEquals(bst.root.left, None)&lt;br /&gt;
         self.assertEquals(bst.root.right, None)&lt;br /&gt;
         &lt;br /&gt;
         bst.makeChildren(bst.root)&lt;br /&gt;
         self.assertNotEquals(bst.root.left, None)&lt;br /&gt;
         self.assertNotEquals(bst.root.right, None)&lt;br /&gt;
 &lt;br /&gt;
     def testSearch(self):&lt;br /&gt;
         bst = BinartSearchTree()&lt;br /&gt;
         bst.makeChildren(bst.root)&lt;br /&gt;
         bst.root.setNode( 2 )&lt;br /&gt;
         bst.root.left.setNode( 1 )&lt;br /&gt;
         bst.root.right.setNode( 3 )&lt;br /&gt;
 &lt;br /&gt;
         self.assertEquals(bst.search(bst.root, 1), True)&lt;br /&gt;
         self.assertEquals(bst.search(bst.root, 5), False)&lt;br /&gt;
 &lt;br /&gt;
     def testInsert(self):&lt;br /&gt;
         bst = BinartSearchTree()&lt;br /&gt;
         bst.makeChildren(bst.root)&lt;br /&gt;
         bst.root.setNode( 2 )&lt;br /&gt;
 &lt;br /&gt;
         bst.insert(bst.root, 1)&lt;br /&gt;
         self.assertEquals(bst.search(bst.root, 1), True)&lt;br /&gt;
         self.assertEquals(bst.insert(bst.root, 1), False)&lt;br /&gt;
 &lt;br /&gt;
         bst.insert(bst.root, 5)&lt;br /&gt;
         self.assertEquals(bst.search(bst.root, 5), True)&lt;br /&gt;
         &lt;br /&gt;
     def testDelete(self):&lt;br /&gt;
         bst = BinartSearchTree()&lt;br /&gt;
         bst.makeChildren(bst.root)&lt;br /&gt;
         bst.root.setNode( 20 )&lt;br /&gt;
 &lt;br /&gt;
         bst.insert(bst.root, 10)&lt;br /&gt;
         bst.insert(bst.root, 5)&lt;br /&gt;
         bst.insert(bst.root, 25)&lt;br /&gt;
         bst.insert(bst.root, 22)&lt;br /&gt;
 &lt;br /&gt;
         self.assertEquals(bst.delete(bst.root, 11), False)&lt;br /&gt;
 &lt;br /&gt;
         self.assertEquals(bst.delete(bst.root, 5), True)&lt;br /&gt;
         self.assertEquals(bst.search(bst.root, 5), False)&lt;br /&gt;
 ####################################################################&lt;br /&gt;
         self.assertEquals(bst.delete(bst.root, 25), True)&lt;br /&gt;
         self.assertEquals(bst.search(bst.root, 25), False)&lt;br /&gt;
 &lt;br /&gt;
         self.assertEquals( bst.root.key , 20 )&lt;br /&gt;
         self.assertEquals( bst.root.left.key , 10 )&lt;br /&gt;
         self.assertEquals( bst.root.right.key , 22)&lt;br /&gt;
 ####################################################################&lt;br /&gt;
         self.assertEquals( bst.delete( bst.root, 20 ), True )&lt;br /&gt;
         self.assertEquals( bst.search( bst.root, 20 ), False )&lt;br /&gt;
 &lt;br /&gt;
         self.assertEquals( bst.root.key, 10)&lt;br /&gt;
         self.assertEquals( bst.root.right.key, 22)&lt;br /&gt;
         self.assertEquals( bst.root.left.key, -1)&lt;br /&gt;
         &lt;br /&gt;
 if __name__ == &amp;#039;__main__&amp;#039;: &lt;br /&gt;
     unittest.main()   &lt;br /&gt;
== C++ version ==&lt;br /&gt;
=== [[황재선]] ===&lt;br /&gt;
* 뭔가 이상하게 동작하는 듯...&lt;br /&gt;
* 오류 있으면 적어주세요~&lt;br /&gt;
* 노드 모두 삭제하면 에러.&lt;br /&gt;
* 할일 : Delete 함수 리펙토링하기, parent 포인터 없애기&lt;br /&gt;
 #include &amp;amp;lt;iostream&amp;amp;gt;&lt;br /&gt;
 using namespace std;&lt;br /&gt;
 &lt;br /&gt;
 struct Node&lt;br /&gt;
 {&lt;br /&gt;
 	Node * left;&lt;br /&gt;
 	int key;&lt;br /&gt;
 	Node * right;&lt;br /&gt;
 	Node * parent;&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 void initNode(Node * aRoot);&lt;br /&gt;
 Node * setNode(Node * p, int aNum);&lt;br /&gt;
 void Insert(Node * aRoot, int aNum);&lt;br /&gt;
 void Delete(Node * aRoot, int aNum);&lt;br /&gt;
 Node * Search(Node * aRoot, int aNum);&lt;br /&gt;
 void DeleteAllNode(Node * aRoot);&lt;br /&gt;
 void printKeys(Node * aRoot);&lt;br /&gt;
 &lt;br /&gt;
 int main()&lt;br /&gt;
 {&lt;br /&gt;
 	Node * root = new Node();&lt;br /&gt;
 	initNode(root);&lt;br /&gt;
 	root-&amp;amp;gt;key = -1;&lt;br /&gt;
 	int number;&lt;br /&gt;
 	int choice;&lt;br /&gt;
 	&lt;br /&gt;
 	while(true)&lt;br /&gt;
 	{&lt;br /&gt;
 		cout &amp;amp;lt;&amp;amp;lt; &amp;quot;1. Insert &amp;quot; &amp;amp;lt;&amp;amp;lt; endl;&lt;br /&gt;
 		cout &amp;amp;lt;&amp;amp;lt; &amp;quot;2. Delete &amp;quot; &amp;amp;lt;&amp;amp;lt; endl;&lt;br /&gt;
 		cout &amp;amp;lt;&amp;amp;lt; &amp;quot;3. Search &amp;quot; &amp;amp;lt;&amp;amp;lt; endl;&lt;br /&gt;
 		cout &amp;amp;lt;&amp;amp;lt; &amp;quot;4. Quit &amp;quot; &amp;amp;lt;&amp;amp;lt; endl;&lt;br /&gt;
 &lt;br /&gt;
 		cin &amp;amp;gt;&amp;amp;gt; choice;&lt;br /&gt;
 		if (choice == 4)&lt;br /&gt;
 		{&lt;br /&gt;
 			DeleteAllNode(root);&lt;br /&gt;
 			return 0;&lt;br /&gt;
 		}&lt;br /&gt;
 		&lt;br /&gt;
 		cout &amp;amp;lt;&amp;amp;lt; &amp;quot;숫자 입력&amp;quot; &amp;amp;lt;&amp;amp;lt; endl;&lt;br /&gt;
 		cin &amp;amp;gt;&amp;amp;gt; number;&lt;br /&gt;
 &lt;br /&gt;
 		switch(choice)&lt;br /&gt;
 		{&lt;br /&gt;
 		case 1:&lt;br /&gt;
 			Insert(root, number);&lt;br /&gt;
 			break;&lt;br /&gt;
 		case 2:&lt;br /&gt;
 			Delete(root, number);&lt;br /&gt;
 			break;&lt;br /&gt;
 		case 3:&lt;br /&gt;
 			Search(root, number);&lt;br /&gt;
 			break;&lt;br /&gt;
 		}&lt;br /&gt;
 		&lt;br /&gt;
 		printKeys(root);		&lt;br /&gt;
 		cout &amp;amp;lt;&amp;amp;lt; &amp;quot;\n&amp;quot;;&lt;br /&gt;
 	}	&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void initNode(Node * aRoot)&lt;br /&gt;
 {&lt;br /&gt;
 	aRoot-&amp;amp;gt;left = NULL;&lt;br /&gt;
 	aRoot-&amp;amp;gt;key = 0;&lt;br /&gt;
 	aRoot-&amp;amp;gt;right = NULL;&lt;br /&gt;
 	aRoot-&amp;amp;gt;parent = NULL;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 Node * setNode(Node * p, int aNum)&lt;br /&gt;
 {&lt;br /&gt;
 	Node * newNode = new Node();&lt;br /&gt;
 	initNode(newNode);&lt;br /&gt;
 	newNode-&amp;amp;gt;key = aNum;&lt;br /&gt;
 	newNode-&amp;amp;gt;parent = p;&lt;br /&gt;
 	return newNode;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void Insert(Node * aRoot, int aNum)&lt;br /&gt;
 {&lt;br /&gt;
 	Node * ptr = Search(aRoot, aNum);&lt;br /&gt;
 	if (ptr-&amp;amp;gt;key == -1)&lt;br /&gt;
 	{&lt;br /&gt;
 		ptr-&amp;amp;gt;key = aNum;&lt;br /&gt;
 		cout &amp;amp;lt;&amp;amp;lt; aNum &amp;amp;lt;&amp;amp;lt; &amp;quot;을 Tree에 추가&amp;quot; &amp;amp;lt;&amp;amp;lt; endl;&lt;br /&gt;
 		return ;&lt;br /&gt;
 	}&lt;br /&gt;
 	if (ptr-&amp;amp;gt;key == aNum)&lt;br /&gt;
 		cout &amp;amp;lt;&amp;amp;lt; &amp;quot;Error&amp;quot; &amp;amp;lt;&amp;amp;lt; endl;&lt;br /&gt;
 	else&lt;br /&gt;
 	{&lt;br /&gt;
 		if (ptr-&amp;amp;gt;key &amp;amp;gt; aNum)&lt;br /&gt;
 			ptr-&amp;amp;gt;left = setNode(ptr, aNum);&lt;br /&gt;
 		else if (ptr-&amp;amp;gt;key &amp;amp;lt; aNum)&lt;br /&gt;
 			ptr-&amp;amp;gt;right = setNode(ptr, aNum);&lt;br /&gt;
 		cout &amp;amp;lt;&amp;amp;lt; aNum &amp;amp;lt;&amp;amp;lt; &amp;quot;을 Tree에 추가&amp;quot; &amp;amp;lt;&amp;amp;lt; endl;&lt;br /&gt;
 	}&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 Node * Search(Node * aRoot, int aNum)&lt;br /&gt;
 {&lt;br /&gt;
 	while (true)&lt;br /&gt;
 	{&lt;br /&gt;
 		if (aRoot-&amp;amp;gt;key == aNum)&lt;br /&gt;
 		{&lt;br /&gt;
 			cout &amp;amp;lt;&amp;amp;lt; aNum &amp;amp;lt;&amp;amp;lt; &amp;quot;은 Tree에 있습니다.&amp;quot; &amp;amp;lt;&amp;amp;lt; endl;&lt;br /&gt;
 			return aRoot;&lt;br /&gt;
 		}&lt;br /&gt;
 		else if (aRoot-&amp;amp;gt;key &amp;amp;gt; aNum)&lt;br /&gt;
 		{&lt;br /&gt;
 			if (aRoot-&amp;amp;gt;left != NULL)&lt;br /&gt;
 				aRoot = aRoot-&amp;amp;gt;left;&lt;br /&gt;
 			else&lt;br /&gt;
 				break;&lt;br /&gt;
 		}&lt;br /&gt;
 		else if (aRoot-&amp;amp;gt;key &amp;amp;lt; aNum)&lt;br /&gt;
 		{&lt;br /&gt;
 			if (aRoot-&amp;amp;gt;right != NULL)&lt;br /&gt;
 				aRoot = aRoot-&amp;amp;gt;right;&lt;br /&gt;
 			else&lt;br /&gt;
 				break;&lt;br /&gt;
 		}&lt;br /&gt;
 	}&lt;br /&gt;
 	cout &amp;amp;lt;&amp;amp;lt; aNum &amp;amp;lt;&amp;amp;lt; &amp;quot;은 Tree에 없습니다.&amp;quot; &amp;amp;lt;&amp;amp;lt; endl;&lt;br /&gt;
 	return aRoot;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void Delete(Node * aRoot, int aNum)&lt;br /&gt;
 {&lt;br /&gt;
 	Node * ptr = Search(aRoot, aNum);&lt;br /&gt;
 	Node * parent = ptr-&amp;amp;gt;parent;&lt;br /&gt;
 	if (ptr-&amp;amp;gt;key != aNum)&lt;br /&gt;
 		cout &amp;amp;lt;&amp;amp;lt; &amp;quot;Error&amp;quot; &amp;amp;lt;&amp;amp;lt; endl;&lt;br /&gt;
 	else&lt;br /&gt;
  	{&lt;br /&gt;
                   cout &amp;amp;lt;&amp;amp;lt; aNum &amp;amp;lt;&amp;amp;lt; &amp;quot;삭제&amp;quot; &amp;amp;lt;&amp;amp;lt; endl;&lt;br /&gt;
 		if (ptr-&amp;amp;gt;left == NULL &amp;amp;amp;&amp;amp;amp; ptr-&amp;amp;gt;right == NULL)			// leaf node&lt;br /&gt;
 		{&lt;br /&gt;
 			if (ptr-&amp;amp;gt;parent == NULL)&lt;br /&gt;
 			{&lt;br /&gt;
 				delete ptr;&lt;br /&gt;
 				return ;&lt;br /&gt;
 			}&lt;br /&gt;
 			if (parent-&amp;amp;gt;left == ptr)&lt;br /&gt;
 			{&lt;br /&gt;
 				parent-&amp;amp;gt;left = NULL;&lt;br /&gt;
 			}&lt;br /&gt;
 			else if (parent-&amp;amp;gt;right == ptr)&lt;br /&gt;
 			{&lt;br /&gt;
 				parent-&amp;amp;gt;right = NULL;&lt;br /&gt;
 			}&lt;br /&gt;
 		}&lt;br /&gt;
 		else if (ptr-&amp;amp;gt;left != NULL &amp;amp;amp;&amp;amp;amp; ptr-&amp;amp;gt;right == NULL)		// single left child &lt;br /&gt;
 		{&lt;br /&gt;
 			if (ptr-&amp;amp;gt;parent == NULL)&lt;br /&gt;
 			{&lt;br /&gt;
 				ptr-&amp;amp;gt;key = ptr-&amp;amp;gt;left-&amp;amp;gt;key;&lt;br /&gt;
 				delete ptr-&amp;amp;gt;left;&lt;br /&gt;
 				ptr-&amp;amp;gt;left = NULL;&lt;br /&gt;
 				return ;&lt;br /&gt;
 			}&lt;br /&gt;
 			if (parent-&amp;amp;gt;left == ptr)&lt;br /&gt;
 				parent-&amp;amp;gt;left = ptr-&amp;amp;gt;left;&lt;br /&gt;
 			else if (parent-&amp;amp;gt;right == ptr)&lt;br /&gt;
 				parent-&amp;amp;gt;right = ptr-&amp;amp;gt;left;&lt;br /&gt;
 			ptr-&amp;amp;gt;left-&amp;amp;gt;parent = parent;&lt;br /&gt;
 		}&lt;br /&gt;
 &lt;br /&gt;
 		else if (ptr-&amp;amp;gt;left == NULL &amp;amp;amp;&amp;amp;amp; ptr-&amp;amp;gt;right != NULL)		// single right child&lt;br /&gt;
 		{&lt;br /&gt;
 			if (ptr-&amp;amp;gt;parent == NULL)&lt;br /&gt;
 			{&lt;br /&gt;
 				ptr-&amp;amp;gt;key = ptr-&amp;amp;gt;right-&amp;amp;gt;key;&lt;br /&gt;
 				delete ptr-&amp;amp;gt;right;&lt;br /&gt;
 				ptr-&amp;amp;gt;right = NULL;&lt;br /&gt;
 				return ;&lt;br /&gt;
 			}&lt;br /&gt;
 			if (parent-&amp;amp;gt;left == ptr)&lt;br /&gt;
 				parent-&amp;amp;gt;left = ptr-&amp;amp;gt;right;&lt;br /&gt;
 			else if (parent-&amp;amp;gt;right == ptr)&lt;br /&gt;
 				parent-&amp;amp;gt;right = ptr-&amp;amp;gt;right;&lt;br /&gt;
 			ptr-&amp;amp;gt;right-&amp;amp;gt;parent = parent;&lt;br /&gt;
 		}&lt;br /&gt;
 		else if (ptr-&amp;amp;gt;left != NULL &amp;amp;amp;&amp;amp;amp; ptr-&amp;amp;gt;right != NULL)		// two child&lt;br /&gt;
 		{&lt;br /&gt;
 			Node * temp = ptr;&lt;br /&gt;
 			ptr = ptr-&amp;amp;gt;right;&lt;br /&gt;
 						&lt;br /&gt;
 			int count = 0;&lt;br /&gt;
 			while(ptr-&amp;amp;gt;left != NULL)&lt;br /&gt;
 			{&lt;br /&gt;
 				count++;&lt;br /&gt;
 				ptr = ptr-&amp;amp;gt;left;&lt;br /&gt;
 			}&lt;br /&gt;
 			temp-&amp;amp;gt;key = ptr-&amp;amp;gt;key;&lt;br /&gt;
 			if (count == 0)&lt;br /&gt;
 				temp-&amp;amp;gt;right = NULL;&lt;br /&gt;
 			else&lt;br /&gt;
 				ptr-&amp;amp;gt;parent-&amp;amp;gt;left = NULL;&lt;br /&gt;
 		}&lt;br /&gt;
 		delete ptr;&lt;br /&gt;
 	}&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void DeleteAllNode(Node * aRoot)&lt;br /&gt;
 {&lt;br /&gt;
 	if (aRoot)&lt;br /&gt;
 	{&lt;br /&gt;
 		DeleteAllNode(aRoot-&amp;amp;gt;left);&lt;br /&gt;
 		DeleteAllNode(aRoot-&amp;amp;gt;right);&lt;br /&gt;
 		delete aRoot;&lt;br /&gt;
 	}&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void printKeys(Node * aRoot)&lt;br /&gt;
 {&lt;br /&gt;
 	if (aRoot)&lt;br /&gt;
 	{&lt;br /&gt;
 		printKeys(aRoot-&amp;amp;gt;left);&lt;br /&gt;
 		cout &amp;amp;lt;&amp;amp;lt; &amp;quot;* &amp;quot;;&lt;br /&gt;
 		cout &amp;amp;lt;&amp;amp;lt; aRoot-&amp;amp;gt;key;&lt;br /&gt;
 		printKeys(aRoot-&amp;amp;gt;right);&lt;br /&gt;
 	}&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[몸짱프로젝트]]&lt;br /&gt;
&lt;/div&gt;</summary>
		<author><name>imported&gt;Unknown</name></author>
	</entry>
</feed>