summaryrefslogtreecommitdiff
path: root/Data_Structures_and_Algorithms_in_Java/ch8.ipynb
diff options
context:
space:
mode:
Diffstat (limited to 'Data_Structures_and_Algorithms_in_Java/ch8.ipynb')
-rw-r--r--Data_Structures_and_Algorithms_in_Java/ch8.ipynb246
1 files changed, 241 insertions, 5 deletions
diff --git a/Data_Structures_and_Algorithms_in_Java/ch8.ipynb b/Data_Structures_and_Algorithms_in_Java/ch8.ipynb
index 6e978756..5f108760 100644
--- a/Data_Structures_and_Algorithms_in_Java/ch8.ipynb
+++ b/Data_Structures_and_Algorithms_in_Java/ch8.ipynb
@@ -1,6 +1,7 @@
{
"metadata": {
- "name": "ch8"
+ "name": "",
+ "signature": "sha256:8af7b49cf811d590bd7b25dd4e6ee061b1b9e37ea11f5e8572f545bc4780f1b4"
},
"nbformat": 3,
"nbformat_minor": 0,
@@ -11,18 +12,253 @@
"cell_type": "heading",
"level": 1,
"metadata": {},
- "source": "Chapter 8 : Binary Trees"
+ "source": [
+ "Chapter 8 : Binary Trees"
+ ]
},
{
"cell_type": "heading",
"level": 3,
"metadata": {},
- "source": "Exmaple 8.1 Page No : 406"
+ "source": [
+ "Exmaple 8.1 Page No : 406"
+ ]
},
{
"cell_type": "code",
"collapsed": false,
- "input": "'''\nexample 8.1\ndemonstrates binary tree\n'''\n\n# for Stack class\nclass Node:\n def __init__(self):\n self.iData = None # data item (key)\n self.dData = None # data item\n self.leftChild = None # this nodes left child\n self.rightChild = None # this nodes right child\n\n def displayNode(self):\n # display ourself\n print '{' , self.iData , ',' ,self.dData , '}',\n\nclass Tree:\n def __init__(self):\n # constructor\n self.root = None # no nodes in tree \n\n def find(self,key): # find node with given key\n # (assumes non-empty tree)\n current = self.root # start at self.root\n while(current.iData != key): # while no match,\n if(key < current.iData): # go left?\n current = current.leftChild\n else: # or go right?\n current = current.rightChild\n if(current == None): # if no child,\n return None # didnt find it\n return current\n\n def insert(self,i,dd):\n newNode = Node() # make new node\n newNode.iData = i # insert data\n newNode.dData = dd\n if(self.root==None):# no node in self.root\n self.root = newNode\n else: # self.root occupied\n current = self.root # start at self.root\n while(True): # (exits internally)\n parent = current\n if(i < current.iData): # go left?\n current = current.leftChild\n if(current == None): # if end of the line,\n # insert on left\n parent.leftChild = newNode\n return\n else:# or go right?\n current = current.rightChild\n if(current == None): # if end of the line \n # insert on right\n parent.rightChild = newNode\n return\n\n def delete(self,key): # delete node with given key\n # (assumes non-empty list)\n current = self.root\n parent = self.root\n isLeftChild = True\n while(current.iData != key):\n parent = current\n if(key < current.iData):\n isLeftChild = True\n current = current.leftChild\n else:\n isLeftChild = False\n current = current.rightChild\n if(current == None):\n return False\n # if no children, simply delete it\n if(current.leftChild==None and current.rightChild==None):\n if(current == self.root): # if self.root,\n self.root = None # tree is empty\n elif(isLeftChild):\n parent.leftChild = None\n else:\n parent.rightChild = None\n\n elif(current.rightChild==None):\n if(current == self.root):\n self.root = current.leftChild\n elif(isLeftChild):\n parent.leftChild = current.leftChild\n else:\n parent.rightChild = current.leftChild # if no left child, replace with right subtree\n elif(current.leftChild==None):\n if(current == self.root):\n self.root = current.rightChild\n elif(isLeftChild):\n parent.leftChild = current.rightChild\n else:\n parent.rightChild = current.rightChild\n else: # two children, so replace with inorder successor\n # get successor of node to delete (current)\n successor = self.getSuccessor(current)\n # connect parent of current to successor instead\n if(current == self.root):\n self.root = successor\n elif(isLeftChild):\n parent.leftChild = successor\n else:\n parent.rightChild = successor\n # connect successor to currents left child\n successor.leftChild = current.leftChild\n return True\n\n def getSuccessor(self,delNode):\n successorParent = delNode\n successor = delNode\n current = delNode.rightChild # go to right child\n while(current != None): # until no more\n # left children,\n successorParent = successor\n successor = current\n current = current.leftChild # go to left child\n # if successor not\n if(successor != delNode.rightChild): # right child,\n # make connections\n successorParent.leftChild = successor.rightChild\n successor.rightChild = delNode.rightChild\n return successor\n\n def traverse(self,traverseType):\n if traverseType == 1:\n print '\\nPreorder traversal: ',\n self.preOrder(self.root)\n elif traverseType == 2:\n print '\\nInorder traversal: ',\n self.inOrder(self.root)\n else:\n print '\\nPostorder traversal: ',\n self.postOrder(self.root)\n print ''\n\n def preOrder(self, localroot):\n if(localroot != None):\n print localroot.iData ,\n self.preOrder(localroot.leftChild)\n self.preOrder(localroot.rightChild)\n\n def inOrder(self, localroot):\n if(localroot != None):\n self.inOrder(localroot.leftChild)\n print localroot.iData ,\n self.inOrder(localroot.rightChild)\n \n def postOrder(self, localroot):\n if(localroot != None):\n self.postOrder(localroot.leftChild)\n self.postOrder(localroot.rightChild)\n print localroot.iData ,\n\n def displayTree(self):\n globalStack = list()\n globalStack.append(self.root)\n nBlanks = 32\n isRowEmpty = False\n print '\\n......................................................'\n while(isRowEmpty==False):\n localStack = list()\n isRowEmpty = True\n for j in range(nBlanks):\n print ' ',\n while(globalStack is not None):\n temp = globalStack.pop()\n if(temp != None):\n print temp.iData,\n localStack.append(temp.leftChild)\n localStack.append(temp.rightChild)\n if(temp.leftChild != None or temp.rightChild != None):\n isRowEmpty = False\n else:\n print '--' ,\n localStack.push(None)\n localStack.push(None)\n for j in range(nBlanks*2-2):\n print ' ', # end while globalStack not empty\n \n print ''\n nBlanks /= 2\n while(localStack is not None):\n globalStack.append( localStack.pop() ) # end while isRowEmpty is false\n \n print '\\n......................................................'\n\ntheTree = Tree()\ntheTree.insert(50,1.5)\ntheTree.insert(25,1.2)\ntheTree.insert(75,1.7)\ntheTree.insert(12,1.5)\ntheTree.insert(37,1.2)\ntheTree.insert(43,1.7)\ntheTree.insert(30,1.5)\ntheTree.insert(33,1.2)\ntheTree.insert(87,1.7)\ntheTree.insert(93,1.5)\ntheTree.insert(97,1.5)\nwhile(True):\n print 'Enter first letter of show, '\n print 'insert, find, delete, or traverse: ',\n choice = raw_input()\n if choice == 's':\n theTree.displayTree()\n elif choice == 'i':\n print 'Enter value to insert: '\n value = int(raw_input())\n theTree.insert(value, value + 0.9)\n elif choice == 'f':\n print 'Enter value to find: ',\n value = int(raw_input())\n found = theTree.find(value)\n if(found != None):\n print 'Found: ', \n found.displayNode()\n print ''\n else:\n print 'Could not find', value \n elif choice=='d':\n print 'Enter value to delete: ',\n value = int(raw_input())\n didDelete = theTree.delete(value)\n if(didDelete):\n print 'Deleted ' , value \n else:\n print 'Could not delete ',value\n elif choice=='t':\n print 'Enter type 1, 2 or 3: '\n value = int(raw_input())\n theTree.traverse(value)\n else:\n print 'Invalid entry'\n",
+ "input": [
+ " \n",
+ "# for Stack class\n",
+ "class Node:\n",
+ " def __init__(self):\n",
+ " self.iData = None # data item (key)\n",
+ " self.dData = None # data item\n",
+ " self.leftChild = None # this nodes left child\n",
+ " self.rightChild = None # this nodes right child\n",
+ "\n",
+ " def displayNode(self):\n",
+ " # display ourself\n",
+ " print '{' , self.iData , ',' ,self.dData , '}',\n",
+ "\n",
+ "class Tree:\n",
+ " def __init__(self):\n",
+ " # constructor\n",
+ " self.root = None # no nodes in tree \n",
+ "\n",
+ " def find(self,key): # find node with given key\n",
+ " # (assumes non-empty tree)\n",
+ " current = self.root # start at self.root\n",
+ " while(current.iData != key): # while no match,\n",
+ " if(key < current.iData): # go left?\n",
+ " current = current.leftChild\n",
+ " else: # or go right?\n",
+ " current = current.rightChild\n",
+ " if(current == None): # if no child,\n",
+ " return None # didnt find it\n",
+ " return current\n",
+ "\n",
+ " def insert(self,i,dd):\n",
+ " newNode = Node() # make new node\n",
+ " newNode.iData = i # insert data\n",
+ " newNode.dData = dd\n",
+ " if(self.root==None):# no node in self.root\n",
+ " self.root = newNode\n",
+ " else: # self.root occupied\n",
+ " current = self.root # start at self.root\n",
+ " while(True): # (exits internally)\n",
+ " parent = current\n",
+ " if(i < current.iData): # go left?\n",
+ " current = current.leftChild\n",
+ " if(current == None): # if end of the line,\n",
+ " # insert on left\n",
+ " parent.leftChild = newNode\n",
+ " return\n",
+ " else:# or go right?\n",
+ " current = current.rightChild\n",
+ " if(current == None): # if end of the line \n",
+ " # insert on right\n",
+ " parent.rightChild = newNode\n",
+ " return\n",
+ "\n",
+ " def delete(self,key): # delete node with given key\n",
+ " # (assumes non-empty list)\n",
+ " current = self.root\n",
+ " parent = self.root\n",
+ " isLeftChild = True\n",
+ " while(current.iData != key):\n",
+ " parent = current\n",
+ " if(key < current.iData):\n",
+ " isLeftChild = True\n",
+ " current = current.leftChild\n",
+ " else:\n",
+ " isLeftChild = False\n",
+ " current = current.rightChild\n",
+ " if(current == None):\n",
+ " return False\n",
+ " # if no children, simply delete it\n",
+ " if(current.leftChild==None and current.rightChild==None):\n",
+ " if(current == self.root): # if self.root,\n",
+ " self.root = None # tree is empty\n",
+ " elif(isLeftChild):\n",
+ " parent.leftChild = None\n",
+ " else:\n",
+ " parent.rightChild = None\n",
+ "\n",
+ " elif(current.rightChild==None):\n",
+ " if(current == self.root):\n",
+ " self.root = current.leftChild\n",
+ " elif(isLeftChild):\n",
+ " parent.leftChild = current.leftChild\n",
+ " else:\n",
+ " parent.rightChild = current.leftChild # if no left child, replace with right subtree\n",
+ " elif(current.leftChild==None):\n",
+ " if(current == self.root):\n",
+ " self.root = current.rightChild\n",
+ " elif(isLeftChild):\n",
+ " parent.leftChild = current.rightChild\n",
+ " else:\n",
+ " parent.rightChild = current.rightChild\n",
+ " else: # two children, so replace with inorder successor\n",
+ " # get successor of node to delete (current)\n",
+ " successor = self.getSuccessor(current)\n",
+ " # connect parent of current to successor instead\n",
+ " if(current == self.root):\n",
+ " self.root = successor\n",
+ " elif(isLeftChild):\n",
+ " parent.leftChild = successor\n",
+ " else:\n",
+ " parent.rightChild = successor\n",
+ " # connect successor to currents left child\n",
+ " successor.leftChild = current.leftChild\n",
+ " return True\n",
+ "\n",
+ " def getSuccessor(self,delNode):\n",
+ " successorParent = delNode\n",
+ " successor = delNode\n",
+ " current = delNode.rightChild # go to right child\n",
+ " while(current != None): # until no more\n",
+ " # left children,\n",
+ " successorParent = successor\n",
+ " successor = current\n",
+ " current = current.leftChild # go to left child\n",
+ " # if successor not\n",
+ " if(successor != delNode.rightChild): # right child,\n",
+ " # make connections\n",
+ " successorParent.leftChild = successor.rightChild\n",
+ " successor.rightChild = delNode.rightChild\n",
+ " return successor\n",
+ "\n",
+ " def traverse(self,traverseType):\n",
+ " if traverseType == 1:\n",
+ " print '\\nPreorder traversal: ',\n",
+ " self.preOrder(self.root)\n",
+ " elif traverseType == 2:\n",
+ " print '\\nInorder traversal: ',\n",
+ " self.inOrder(self.root)\n",
+ " else:\n",
+ " print '\\nPostorder traversal: ',\n",
+ " self.postOrder(self.root)\n",
+ " print ''\n",
+ "\n",
+ " def preOrder(self, localroot):\n",
+ " if(localroot != None):\n",
+ " print localroot.iData ,\n",
+ " self.preOrder(localroot.leftChild)\n",
+ " self.preOrder(localroot.rightChild)\n",
+ "\n",
+ " def inOrder(self, localroot):\n",
+ " if(localroot != None):\n",
+ " self.inOrder(localroot.leftChild)\n",
+ " print localroot.iData ,\n",
+ " self.inOrder(localroot.rightChild)\n",
+ " \n",
+ " def postOrder(self, localroot):\n",
+ " if(localroot != None):\n",
+ " self.postOrder(localroot.leftChild)\n",
+ " self.postOrder(localroot.rightChild)\n",
+ " print localroot.iData ,\n",
+ "\n",
+ " def displayTree(self):\n",
+ " globalStack = list()\n",
+ " globalStack.append(self.root)\n",
+ " nBlanks = 32\n",
+ " isRowEmpty = False\n",
+ " print '\\n......................................................'\n",
+ " while(isRowEmpty==False):\n",
+ " localStack = list()\n",
+ " isRowEmpty = True\n",
+ " for j in range(nBlanks):\n",
+ " print ' ',\n",
+ " while(globalStack is not None):\n",
+ " temp = globalStack.pop()\n",
+ " if(temp != None):\n",
+ " print temp.iData,\n",
+ " localStack.append(temp.leftChild)\n",
+ " localStack.append(temp.rightChild)\n",
+ " if(temp.leftChild != None or temp.rightChild != None):\n",
+ " isRowEmpty = False\n",
+ " else:\n",
+ " print '--' ,\n",
+ " localStack.push(None)\n",
+ " localStack.push(None)\n",
+ " for j in range(nBlanks*2-2):\n",
+ " print ' ', # end while globalStack not empty\n",
+ " \n",
+ " print ''\n",
+ " nBlanks /= 2\n",
+ " while(localStack is not None):\n",
+ " globalStack.append( localStack.pop() ) # end while isRowEmpty is false\n",
+ " \n",
+ " print '\\n......................................................'\n",
+ "\n",
+ "theTree = Tree()\n",
+ "theTree.insert(50,1.5)\n",
+ "theTree.insert(25,1.2)\n",
+ "theTree.insert(75,1.7)\n",
+ "theTree.insert(12,1.5)\n",
+ "theTree.insert(37,1.2)\n",
+ "theTree.insert(43,1.7)\n",
+ "theTree.insert(30,1.5)\n",
+ "theTree.insert(33,1.2)\n",
+ "theTree.insert(87,1.7)\n",
+ "theTree.insert(93,1.5)\n",
+ "theTree.insert(97,1.5)\n",
+ "while(True):\n",
+ " print 'Enter first letter of show, '\n",
+ " print 'insert, find, delete, or traverse: ',\n",
+ " choice = raw_input()\n",
+ " if choice == 's':\n",
+ " theTree.displayTree()\n",
+ " elif choice == 'i':\n",
+ " print 'Enter value to insert: '\n",
+ " value = int(raw_input())\n",
+ " theTree.insert(value, value + 0.9)\n",
+ " elif choice == 'f':\n",
+ " print 'Enter value to find: ',\n",
+ " value = int(raw_input())\n",
+ " found = theTree.find(value)\n",
+ " if(found != None):\n",
+ " print 'Found: ', \n",
+ " found.displayNode()\n",
+ " print ''\n",
+ " else:\n",
+ " print 'Could not find', value \n",
+ " elif choice=='d':\n",
+ " print 'Enter value to delete: ',\n",
+ " value = int(raw_input())\n",
+ " didDelete = theTree.delete(value)\n",
+ " if(didDelete):\n",
+ " print 'Deleted ' , value \n",
+ " else:\n",
+ " print 'Could not delete ',value\n",
+ " elif choice=='t':\n",
+ " print 'Enter type 1, 2 or 3: '\n",
+ " value = int(raw_input())\n",
+ " theTree.traverse(value)\n",
+ " else:\n",
+ " print 'Invalid entry'\n"
+ ],
"language": "python",
"metadata": {},
"outputs": []
@@ -30,7 +266,7 @@
{
"cell_type": "code",
"collapsed": false,
- "input": "",
+ "input": [],
"language": "python",
"metadata": {},
"outputs": []