diff --git a/README.md b/README.md index 3f93c3e..d6ddd21 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ DataStructure And Algorithmic Thinking With Python -------------------------------------------------- -Copyright (c) Dec 21, 2014 CareerMonk Publications and others. +Copyright (c) Oct 22, 2018 CareerMonk Publications and others. E-Mail : info@careermonk.com diff --git a/Sample Linked Lists Chapter [Data Structure and Algorithmic Thinking with Python].pdf b/Sample Linked Lists Chapter [Data Structure and Algorithmic Thinking with Python].pdf index d2bf81d..1ea73f2 100644 Binary files a/Sample Linked Lists Chapter [Data Structure and Algorithmic Thinking with Python].pdf and b/Sample Linked Lists Chapter [Data Structure and Algorithmic Thinking with Python].pdf differ diff --git a/Table of Contents [Data Structure and Algorithmic Thinking with Python].pdf b/Table of Contents [Data Structure and Algorithmic Thinking with Python].pdf index 2cd842a..a52c66f 100644 Binary files a/Table of Contents [Data Structure and Algorithmic Thinking with Python].pdf and b/Table of Contents [Data Structure and Algorithmic Thinking with Python].pdf differ diff --git a/src/chapter01introduction/ComplexityWithBreakStatement.py b/src/chapter01introduction/ComplexityWithBreakStatement.py index 423dd56..f068be2 100644 --- a/src/chapter01introduction/ComplexityWithBreakStatement.py +++ b/src/chapter01introduction/ComplexityWithBreakStatement.py @@ -9,15 +9,17 @@ # merchantability or fitness for a particular purpose. -def Function(n): +def function(n): count = 0 for i in range(n / 2, n): # Outer loop execute n/2 times j = 1 + count = count + 1 while j + n / 2 <= n: # Middle loop has break break j = j * 2 + count = count + 1 print (count) -Function(20) +function(20) diff --git a/src/chapter01introduction/IfElese.py b/src/chapter01introduction/IfElese.py index 12cc345..1e54f4c 100644 --- a/src/chapter01introduction/IfElese.py +++ b/src/chapter01introduction/IfElese.py @@ -9,14 +9,14 @@ # merchantability or fitness for a particular purpose. # O(1) -def SimpleIfCondition(n): +def simple_if_condition(n): i = n if i == 0: i = i + 1 print i # O(1) -def IfElseCondition(n): +def if_else_condition(n): i = n if i == 0: i = i + 1 @@ -25,7 +25,7 @@ def IfElseCondition(n): print i # O(n) -def IfElseCondition2(n): +def if_else_condition2(n): i = n if i > 0: for j in range(1,n): @@ -35,9 +35,9 @@ def IfElseCondition2(n): print i # O(n^2): Note that if testFunction is executed always -def IfElseCondition3(n): +def if_else_condition3(n): i = n - if testFunction(n) > 0: + if test_function(n) > 0: for j in range(1,n): print j elif i < 0: @@ -45,6 +45,6 @@ def IfElseCondition3(n): print i # O(n) -def testFunction(n): +def test_function(n): for j in range(1,n): print j \ No newline at end of file diff --git a/src/chapter01introduction/LogLogNComplexity.py b/src/chapter01introduction/LogLogNComplexity.py index 8e52548..c3bb9bd 100644 --- a/src/chapter01introduction/LogLogNComplexity.py +++ b/src/chapter01introduction/LogLogNComplexity.py @@ -11,13 +11,13 @@ import math count = 0 -def Function(n): +def function(n): global count if n <= 2: return 1 else: - Function(round(math.sqrt(n))) + function(round(math.sqrt(n))) count = count + 1 return count -print(Function(200)) +print(function(200)) diff --git a/src/chapter01introduction/LogSquareNComplexity.py b/src/chapter01introduction/LogSquareNComplexity.py index c4a866b..2d31b12 100644 --- a/src/chapter01introduction/LogSquareNComplexity.py +++ b/src/chapter01introduction/LogSquareNComplexity.py @@ -10,7 +10,7 @@ count = 0 -def Logarithms(n): +def logarithms(n): i = 1 global count while i <= n: @@ -21,4 +21,4 @@ def Logarithms(n): i = i * 2 return count -print(Logarithms(10)) +print(logarithms(10)) diff --git a/src/chapter01introduction/Logarithms.py b/src/chapter01introduction/Logarithms.py index 2ee1810..7d3d1d4 100644 --- a/src/chapter01introduction/Logarithms.py +++ b/src/chapter01introduction/Logarithms.py @@ -9,19 +9,19 @@ # merchantability or fitness for a particular purpose. -def Logarithms(n): +def logarithms(n): i = n while i >= 1: i = i // 2 print i -Logarithms(100) +logarithms(100) -def Logarithms2(n): +def logarithms2(n): i = 1 while i <= n: i = i * 2 print i -Logarithms(100) +logarithms(100) diff --git a/src/chapter01introduction/NCubeLognComplexity.py b/src/chapter01introduction/NCubeLognComplexity.py index 62a41c6..d10215c 100644 --- a/src/chapter01introduction/NCubeLognComplexity.py +++ b/src/chapter01introduction/NCubeLognComplexity.py @@ -17,4 +17,4 @@ def function(n): for i in range(1, 8): # This loop executes 8 times with n value half in every call function (n / 2) for i in range(1, n ** 3): # This loop executes n^3 times with constant time loop - counter = counter + 1 + counter = counter + 1 \ No newline at end of file diff --git a/src/chapter01introduction/NLogNwithLoops.py b/src/chapter01introduction/NLogNwithLoops.py index 747ea33..3a099fd 100644 --- a/src/chapter01introduction/NLogNwithLoops.py +++ b/src/chapter01introduction/NLogNwithLoops.py @@ -9,7 +9,7 @@ # merchantability or fitness for a particular purpose. -def Function(n): +def function(n): count = 0 if n <= 0: return @@ -20,7 +20,7 @@ def Function(n): count = count + 1 print (count) -Function(20) +function(20) def Function2(n): for i in range(1, n): @@ -32,11 +32,11 @@ def Function2(n): Function2(20) import math -def Function(n): +def function(n): for i in range(1, n / 3): j = 1 while j <= n: j = j + 4 print("*") -Function(20) +function(20) diff --git a/src/chapter01introduction/NLogSquareComplexity.py b/src/chapter01introduction/NLogSquareComplexity.py index 791d893..f55fcb7 100644 --- a/src/chapter01introduction/NLogSquareComplexity.py +++ b/src/chapter01introduction/NLogSquareComplexity.py @@ -9,7 +9,7 @@ # merchantability or fitness for a particular purpose. -def Function(n): +def function(n): count = 0 for i in range(n / 2, n): # Outer loop execute n/2 times j = 1 @@ -22,4 +22,4 @@ def Function(n): print (count) -Function(20) +function(20) diff --git a/src/chapter01introduction/NPower5Complexity.py b/src/chapter01introduction/NPower5Complexity.py index 5fab7c2..f187090 100644 --- a/src/chapter01introduction/NPower5Complexity.py +++ b/src/chapter01introduction/NPower5Complexity.py @@ -9,7 +9,7 @@ # merchantability or fitness for a particular purpose. -def Function(n): +def function(n): for i in range(1, n): j = i while j < i * i: @@ -18,4 +18,4 @@ def Function(n): for k in range(0, j): print(" * ") -Function(10) +function(10) diff --git a/src/chapter01introduction/NSquareLogNComplexity.py b/src/chapter01introduction/NSquareLogNComplexity.py index 140e4fa..326782e 100644 --- a/src/chapter01introduction/NSquareLogNComplexity.py +++ b/src/chapter01introduction/NSquareLogNComplexity.py @@ -9,7 +9,7 @@ # merchantability or fitness for a particular purpose. -def Function(n): +def function(n): count = 0 for i in range(n / 2, n): # Outer loop execute n/2 times j = 1 @@ -22,4 +22,4 @@ def Function(n): print (count) -Function(20) +function(20) diff --git a/src/chapter01introduction/NestedLoop.py b/src/chapter01introduction/NestedLoop.py index 405b304..4763a3b 100644 --- a/src/chapter01introduction/NestedLoop.py +++ b/src/chapter01introduction/NestedLoop.py @@ -14,4 +14,4 @@ n = 10 for i in range(1, n): for j in range(1, n): - print 'i value %d and j value %d' % (i, j) + print 'i value %d and j value %d' % (i, j) diff --git a/src/chapter01introduction/RecursiveComplexity.py b/src/chapter01introduction/RecursiveComplexity.py index cb46c74..ff5f4bb 100644 --- a/src/chapter01introduction/RecursiveComplexity.py +++ b/src/chapter01introduction/RecursiveComplexity.py @@ -9,16 +9,16 @@ # merchantability or fitness for a particular purpose. -def Function(n): +def function(n): count = 0 if n <= 0: return for i in range(1, n): for j in range(1, n): count = count + 1 - Function(n - 3) + function(n - 3) print (count) -Function(20) +function(20) diff --git a/src/chapter01introduction/RecursiveComplexityFNby3.py b/src/chapter01introduction/RecursiveComplexityFNby3.py index c0e2309..22137ea 100644 --- a/src/chapter01introduction/RecursiveComplexityFNby3.py +++ b/src/chapter01introduction/RecursiveComplexityFNby3.py @@ -9,12 +9,12 @@ # merchantability or fitness for a particular purpose. -def Function(n): +def function(n): if n <= 0: return for i in range(1, 3): # This loop executes 3 times with recursive value of n/3 value - Function(n / 3) -Function(20) + function(n / 3) +function(20) def Function2(n): if n <= 0: diff --git a/src/chapter01introduction/RecursiveNComplexity.py b/src/chapter01introduction/RecursiveNComplexity.py index 901cb8c..d5040ab 100644 --- a/src/chapter01introduction/RecursiveNComplexity.py +++ b/src/chapter01introduction/RecursiveNComplexity.py @@ -10,7 +10,7 @@ count = 0 -def Function(n): +def function(n): global count count = 1 if n <= 0: @@ -18,10 +18,10 @@ def Function(n): for i in range(1, n): count = count + 1 n = n // 2; - Function(n) + function(n) print count -Function(200) +function(200) def Function2(n): if n <= 0: @@ -31,4 +31,4 @@ def Function2(n): Function2(n / 2) print ("*") -Function(20) +function(20) diff --git a/src/chapter01introduction/SimpleLoop.py b/src/chapter01introduction/SimpleLoop.py index e2416de..dd27d3a 100644 --- a/src/chapter01introduction/SimpleLoop.py +++ b/src/chapter01introduction/SimpleLoop.py @@ -13,5 +13,5 @@ # outer loop executed n times for i in range(1, n): # inner loop executes n times - for j in range1, n): + for j in range(1, n): print 'i value %d and j value %d' % (i, j) # constant time diff --git a/src/chapter01introduction/SqrtComplextity.py b/src/chapter01introduction/SqrtComplextity.py index 1590279..a50efa2 100644 --- a/src/chapter01introduction/SqrtComplextity.py +++ b/src/chapter01introduction/SqrtComplextity.py @@ -9,7 +9,7 @@ # merchantability or fitness for a particular purpose. -def Function(n): +def function(n): i = s = 1 while s < n: i = i + 1 @@ -17,7 +17,7 @@ def Function(n): print("*") -Function(20) +function(20) def Function2(n): i = 1 diff --git a/src/chapter02recursionandbacktracking/BitSequences.py b/src/chapter02recursionandbacktracking/BitSequences.py index 7afcbed..51fb2b3 100644 --- a/src/chapter02recursionandbacktracking/BitSequences.py +++ b/src/chapter02recursionandbacktracking/BitSequences.py @@ -9,20 +9,20 @@ # merchantability or fitness for a particular purpose. -def appendAtBeginningFront(x, L): - return [x + element for element in L] +def append_at_front(x, L): + return [x + element for element in L] -def bitStrings(n): +def bit_strings(n): if n == 0: return [] if n == 1: return ["0", "1"] else: - return (appendAtBeginningFront("0", bitStrings(n - 1)) + appendAtBeginningFront("1", bitStrings(n - 1))) + return (append_at_front("0", bit_strings(n - 1)) + append_at_front("1", bit_strings(n - 1))) -print bitStrings(4) +print bit_strings(4) -def bitStrings2(n): - if n == 0: return [] - if n == 1: return ["0", "1"] - return [ digit + bitstring for digit in bitStrings2(1) - for bitstring in bitStrings2(n - 1)] -print bitStrings2(4) +def bit_strings2(n): + if n == 0: return [] + if n == 1: return ["0", "1"] + return [ digit + bitstring for digit in bit_strings2(1) + for bitstring in bit_strings2(n - 1)] +print bit_strings2(4) diff --git a/src/chapter02recursionandbacktracking/KBitSequences.py b/src/chapter02recursionandbacktracking/KBitSequences.py index 8cf99be..8b3e35e 100644 --- a/src/chapter02recursionandbacktracking/KBitSequences.py +++ b/src/chapter02recursionandbacktracking/KBitSequences.py @@ -9,15 +9,14 @@ # merchantability or fitness for a particular purpose. -def rangeToList(k): +def range_to_list(k): result = [] for i in range(0, k): result.append(str(i)) return result -def BaseKStrings(n, k): +def base_k_strings(n, k): if n == 0: return [] - if n == 1: return rangeToList(k) - return [ digit + bitstring for digit in BaseKStrings(1, k) - for bitstring in BaseKStrings(n - 1, k)] -print BaseKStrings(4, 3) + if n == 1: return range_to_list(k) + return [ digit + bitstring for digit in base_k_strings(1, k) for bitstring in base_k_strings(n - 1, k)] +print base_k_strings(4, 3) diff --git a/src/chapter02recursionandbacktracking/PathFinder.py b/src/chapter02recursionandbacktracking/PathFinder.py new file mode 100644 index 0000000..fc11783 --- /dev/null +++ b/src/chapter02recursionandbacktracking/PathFinder.py @@ -0,0 +1,28 @@ +# Copyright (c) Dec 22, 2014 CareerMonk Publications and others. +# E-Mail : info@careermonk.com +# Creation Date : 2014-01-10 06:15:46 +# Last modification : 2008-10-31 +# by : Narasimha Karumanchi +# Book Title : Data Structures And Algorithmic Thinking With Python +# Warranty : This software is provided "as is" without any +# warranty; without even the implied warranty of +# merchantability or fitness for a particular purpose. + +def path_finder( Matrix , position , N ): + # returns list of the paths taken + if position == ( N - 1 , N - 1 ): + return [ ( N - 1 , N - 1 ) ] + x , y = position + if x + 1 < N and Matrix[x+1][y] == 1: + a = path_finder( Matrix , ( x + 1 , y ) , N ) + if a != None: + return [ (x , y ) ] + a + + if y + 1 < N and Matrix[x][y+1] == 1: + b = path_finder( Matrix , (x , y + 1) , N ) + if b != None: + return [ ( x , y ) ] + b + +Matrix = [[ 1 , 1 , 1, 1 , 0], [ 0 , 1 , 0, 1 , 0], [ 0 , 1 , 0, 1 , 0], [ 0 , 1 , 0, 0 , 0], [ 1 , 1 , 1, 1 , 1]] + +print path_finder(Matrix,(0,0),5) \ No newline at end of file diff --git a/src/chapter03linkedlists/CloneLinkedListWithSpace.py b/src/chapter03linkedlists/CloneLinkedListWithSpace.py index a49213d..a127287 100644 --- a/src/chapter03linkedlists/CloneLinkedListWithSpace.py +++ b/src/chapter03linkedlists/CloneLinkedListWithSpace.py @@ -10,58 +10,58 @@ class Node: def __init__(self, data): - self.setData(data) - self.setNext(None) - self.setRand(None) + self.set_data(data) + self.set_next(None) + self.set_rand(None) # method for setting the data field of the node - def setData(self, data): + def set_data(self, data): self.data = data # method for getting the data field of the node - def getData(self): + def get_data(self): return self.data # method for setting the next field of the node - def setNext(self, next): - self.next = next + def set_next(self, nextV): + self.next = nextV # method for setting the next field of the node - def setRand(self, rand): + def set_rand(self, rand): self.rand = rand # method for getting the next field of the node - def getRand(self): + def get_rand(self): return self.rand # method for getting the next field of the node - def getNext(self): + def get_next(self): return self.next # returns true if the node points to another node - def hasNext(self): + def has_next(self): return self.next != None - def cloneLinkedList(old): + def clone_linked_list(old): if not old: return old_copy = old - root = Node(old.getData()) + root = Node(old.get_data()) prev = root temp = None - old = old.getNext() + old = old.get_next() mapping = {} while old: - temp = Node(old.getData()) + temp = Node(old.get_data()) mapping[old] = temp - prev.setNext(temp) + prev.set_next(temp) prev = temp - old = old.getNext() + old = old.get_next() old = old_copy temp = root while old: - temp.setRand(mapping[old.rand]) - temp = temp.getNext() - old = old.getNext() + temp.set_rand(mapping[old.rand]) + temp = temp.get_next() + old = old.get_next() return root diff --git a/src/chapter03linkedlists/CloneLinkedListWithoutExtraSpace.py b/src/chapter03linkedlists/CloneLinkedListWithoutExtraSpace.py index 3c9a42d..2445bc0 100644 --- a/src/chapter03linkedlists/CloneLinkedListWithoutExtraSpace.py +++ b/src/chapter03linkedlists/CloneLinkedListWithoutExtraSpace.py @@ -18,7 +18,7 @@ def __init__(self, x): class Solution: # @param head, a RandomListNode # @return a RandomListNode - def copyRandomList(self, head): + def copy_random_list(self, head): if None == head: return None save_list = [ ] diff --git a/src/chapter03linkedlists/DLL.py b/src/chapter03linkedlists/DLL.py index 5335203..3ae3ebe 100644 --- a/src/chapter03linkedlists/DLL.py +++ b/src/chapter03linkedlists/DLL.py @@ -16,19 +16,19 @@ def __init__(self, data=None, next=None, prev=None): self.next = next self.prev = prev # method for setting the data field of the node - def setData(self, data): + def set_data(self, data): self.data = data # method for getting the data field of the node - def getData(self): + def get_data(self): return self.data # method for setting the next field of the node - def setNext(self, next): + def set_next(self, next): self.next = next # method for getting the next field of the node - def getNext(self): + def get_next(self): return self.next # returns true if the node points to another node - def hasNext(self): + def has_next(self): return self.next != None # method for setting the next field of the node def setPrev(self, prev): @@ -95,7 +95,7 @@ def insertAtBeginning(self, data): self.head = self.tail = newNode else: newNode.setPrev(None) - newNode.setNext(self.head) + newNode.set_next(self.head) self.head.setPrev(newNode) self.head = newNode @@ -105,8 +105,8 @@ def getNode(self, index): if currentNode == None: return None i = 0 - while i < index and currentNode.getNext() is not None: - currentNode = currentNode.getNext() + while i < index and currentNode.get_next() is not None: + currentNode = currentNode.get_next() if currentNode == None: break i += 1 @@ -118,13 +118,13 @@ def insertAtGivenPosition(self, index, data): self.insertAtBeginning(data) elif index > 0: temp = self.getNode(index) - if temp == None or temp.getNext() == None: + if temp == None or temp.get_next() == None: self.insert(data) else: - newNode.setNext(temp.getNext()) + newNode.set_next(temp.get_next()) newNode.setPrev(temp) - temp.getNext().setPrev(newNode) - temp.setNext(newNode) + temp.get_next().setPrev(newNode) + temp.set_next(newNode) def find(self, data): current = self.head diff --git a/src/chapter03linkedlists/DLL_test.py b/src/chapter03linkedlists/DLL_test.py index 4a0f1b0..1c654cf 100644 --- a/src/chapter03linkedlists/DLL_test.py +++ b/src/chapter03linkedlists/DLL_test.py @@ -8,35 +8,35 @@ class TestSequenceFunctions(unittest.TestCase): def test_insert(self): dll = DoubleLinkedList() dll.insert("alice") - self.assertEqual(dll.getNode(0).getData(), "alice") + self.assertEqual(dll.getNode(0).get_data(), "alice") dll.insert("bob") dll.insert("charlie") - self.assertEqual(dll.getNode(1).getData(), "bob") - self.assertEqual(dll.getNode(2).getData(), "charlie") + self.assertEqual(dll.getNode(1).get_data(), "bob") + self.assertEqual(dll.getNode(2).get_data(), "charlie") # insert a node after bill, fixes insertAtGivenPosition logic # bill should go in between bob and charlie dll.insertAtGivenPosition(1, "bill") - self.assertEqual(dll.getNode(2).getData(), "bill") - self.assertEqual(dll.getNode(2).getPrev().getData(), "bob") - self.assertEqual(dll.getNode(2).getNext().getData(), "charlie") + self.assertEqual(dll.getNode(2).get_data(), "bill") + self.assertEqual(dll.getNode(2).getPrev().get_data(), "bob") + self.assertEqual(dll.getNode(2).get_next().get_data(), "charlie") #insert an index that should go on the end and exercise the # insertAtEnd method which didn't exist dll.insertAtGivenPosition(100, "donna") - self.assertEqual(dll.getNode(4).getData(), "donna") + self.assertEqual(dll.getNode(4).get_data(), "donna") def test_delete(self): dll = DoubleLinkedList() dll.insert("alice") dll.insert("bob") dll.insert("charlie") - self.assertEqual(dll.getNode(2).getData(), "charlie") + self.assertEqual(dll.getNode(2).get_data(), "charlie") # charlie should shift over now to where bob was dll.delete("bob") - self.assertEqual(dll.getNode(1).getData(), "charlie") + self.assertEqual(dll.getNode(1).get_data(), "charlie") diff --git a/src/chapter03linkedlists/DeleteLinkedListDuplicates.py b/src/chapter03linkedlists/DeleteLinkedListDuplicates.py index e939695..a7fc3d0 100644 --- a/src/chapter03linkedlists/DeleteLinkedListDuplicates.py +++ b/src/chapter03linkedlists/DeleteLinkedListDuplicates.py @@ -11,8 +11,8 @@ def deleteLinkedListDuplicates(self): current = self.head; while current != None and current.next != None: - if current.getData() == current.getNext().getData(): - current.setNext(current.getNext().getNext()) + if current.get_data() == current.get_next().get_data(): + current.set_next(current.get_next().get_next()) else: - current = current.getNext() + current = current.get_next() return head diff --git a/src/chapter03linkedlists/DetectCycleStart.py b/src/chapter03linkedlists/DetectCycleStart.py index bfe33b1..6529db4 100644 --- a/src/chapter03linkedlists/DetectCycleStart.py +++ b/src/chapter03linkedlists/DetectCycleStart.py @@ -17,16 +17,16 @@ def __init__(self, data): self.data = data self.next = None - def setData(self, data): + def set_data(self, data): self.data = data - def getData(self): + def get_data(self): return self.data - def setNext(self, next): + def set_next(self, next): self.next = next - def getNext(self): + def get_next(self): return self.next @@ -39,7 +39,7 @@ def isEmpty(self): def insertAtBeg(self, item): node = Node(item) - node.setNext(self.head) + node.set_next(self.head) self.head = node def length(self): @@ -47,28 +47,28 @@ def length(self): count = 0 while current != None: count += 1 - current = current.getNext() + current = current.get_next() return count def search(self, item): found = False current = self.head while current != None and not found: - if current.getData() == item: + if current.get_data() == item: found = True else: - current = current.getNext() + current = current.get_next() return found def insertAtEnd(self, item): current = self.head - while current.getNext() != None: - current = current.getNext() + while current.get_next() != None: + current = current.get_next() node = Node(item) - current.setNext(node) + current.set_next(node) def insertBeforeItem(self, inItem, item): current = self.head @@ -77,16 +77,16 @@ def insertBeforeItem(self, inItem, item): stop = False while current != None and not found and not stop: - if current.getData() == item: + if current.get_data() == item: found = True stop = True else: previous = current - current = current.getNext() + current = current.get_next() node = Node(inItem) - previous.setNext(node) - node.setNext(current) + previous.set_next(node) + node.set_next(current) def insertAfterItem(self, inItem, item): @@ -96,16 +96,16 @@ def insertAfterItem(self, inItem, item): stop = False while current != None and not found and not stop: - if current.getData() == item: + if current.get_data() == item: found = True stop = True else: # previous = current - current = current.getNext() - successor = current.getNext() + current = current.get_next() + successor = current.get_next() node = Node(inItem) - current.setNext(node) - node.setNext(successor) + current.set_next(node) + node.set_next(successor) @@ -115,8 +115,8 @@ def printList(self): current = self.head while current != None: - print current.getData() - current = current.getNext() + print current.get_data() + current = current.get_next() def remove(self, item): @@ -124,15 +124,15 @@ def remove(self, item): current = self.head previous = None - while current.getNext() != None and not found: - if current.getData() == item: - print current.getData() - print previous.getData() + while current.get_next() != None and not found: + if current.get_data() == item: + print current.get_data() + print previous.get_data() found = True - previous.setNext(current.next) + previous.set_next(current.next) else: previous = current - current = current.getNext() + current = current.get_next() def induceCycle(self, end, start): current = self.head @@ -144,33 +144,33 @@ def induceCycle(self, end, start): count += 1 if count == end: endnodeFound = True - endnodePointer = current.getNext() + endnodePointer = current.get_next() else: if count == start: stop = True else: - current = current.getNext() + current = current.get_next() - current.setNext(endnodePointer) + current.set_next(endnodePointer) def detectCycle(self): hare = self.head tortoise = self.head while (hare and tortoise): - hare = hare.getNext() + hare = hare.get_next() if (hare == tortoise): return True if hare == None: return False - hare = hare.getNext() + hare = hare.get_next() if (hare == tortoise): return True - tortoise = tortoise.getNext() + tortoise = tortoise.get_next() def detectCycleStart(self) : if None == self.head or None == self.head.next: @@ -189,7 +189,7 @@ def detectCycleStart(self) : slow = slow.next fast = fast.next - return slow.getData() # beginning of loop + return slow.get_data() # beginning of loop diff --git a/src/chapter03linkedlists/FindIntersectingNodeUsingHash.py b/src/chapter03linkedlists/FindIntersectingNodeUsingHash.py index 0d499eb..33ccf10 100644 --- a/src/chapter03linkedlists/FindIntersectingNodeUsingHash.py +++ b/src/chapter03linkedlists/FindIntersectingNodeUsingHash.py @@ -13,12 +13,12 @@ def findIntersectingNode(self, list1, list2): t = list1 while None != t: intersect[t] = True - t = t.getNext() + t = t.get_next() # first duplicate is intersection t = list2 while None != t: if None != intersect.get(t): return t - t = t.getNext() + t = t.get_next() return None diff --git a/src/chapter03linkedlists/FindMiddleNodeEfficient.py b/src/chapter03linkedlists/FindMiddleNodeEfficient.py index 924dd88..bdbca02 100644 --- a/src/chapter03linkedlists/FindMiddleNodeEfficient.py +++ b/src/chapter03linkedlists/FindMiddleNodeEfficient.py @@ -13,16 +13,16 @@ def __init__(self, data): self.data = data self.next = None - def setData(self, data): + def set_data(self, data): self.data = data - def getData(self): + def get_data(self): return self.data - def setNext(self, next): + def set_next(self, next): self.next = next - def getNext(self): + def get_next(self): return self.next @@ -35,12 +35,12 @@ def recursiveReverseList(self) : def reverseRecursive(self, n) : if None != n: - right = n.getNext() + right = n.get_next() if self.head != n: - n.setNext(self.head) + n.set_next(self.head) self.head = n else: - n.setNext(None) + n.set_next(None) self.reverseRecursive(right) def findMiddleNode(self) : @@ -48,34 +48,34 @@ def findMiddleNode(self) : slowPtr = self.head while (fastPtr != None): - fastPtr = fastPtr.getNext() + fastPtr = fastPtr.get_next() if (fastPtr == None): return slowPtr - fastPtr = fastPtr.getNext() - slowPtr = slowPtr.getNext() + fastPtr = fastPtr.get_next() + slowPtr = slowPtr.get_next() return slowPtr def insertAtEnd(self, item): current = self.head if current == None: node = Node(item) - node.setNext(None) + node.set_next(None) self.head = node return - while current.getNext() != None: - current = current.getNext() + while current.get_next() != None: + current = current.get_next() node = Node(item) - current.setNext(node) + current.set_next(node) def printList(self): current = self.head while current != None: - print current.getData() - current = current.getNext() + print current.get_data() + current = current.get_next() @@ -89,4 +89,4 @@ def printList(self): linkedlst.printList() linkedlst.recursiveReverseList() linkedlst.printList() - print(linkedlst.findMiddleNode().getData()) + print(linkedlst.findMiddleNode().get_data()) diff --git a/src/chapter03linkedlists/FndLoopLength.py b/src/chapter03linkedlists/FndLoopLength.py index 7b1e083..dff008f 100644 --- a/src/chapter03linkedlists/FndLoopLength.py +++ b/src/chapter03linkedlists/FndLoopLength.py @@ -17,16 +17,16 @@ def __init__(self, data): self.data = data self.next = None - def setData(self, data): + def set_data(self, data): self.data = data - def getData(self): + def get_data(self): return self.data - def setNext(self, next): + def set_next(self, next): self.next = next - def getNext(self): + def get_next(self): return self.next @@ -39,7 +39,7 @@ def isEmpty(self): def insertAtBeg(self, item): node = Node(item) - node.setNext(self.head) + node.set_next(self.head) self.head = node def length(self): @@ -47,28 +47,28 @@ def length(self): count = 0 while current != None: count += 1 - current = current.getNext() + current = current.get_next() return count def search(self, item): found = False current = self.head while current != None and not found: - if current.getData() == item: + if current.get_data() == item: found = True else: - current = current.getNext() + current = current.get_next() return found def insertAtEnd(self, item): current = self.head - while current.getNext() != None: - current = current.getNext() + while current.get_next() != None: + current = current.get_next() node = Node(item) - current.setNext(node) + current.set_next(node) def insertBeforeItem(self, inItem, item): current = self.head @@ -77,16 +77,16 @@ def insertBeforeItem(self, inItem, item): stop = False while current != None and not found and not stop: - if current.getData() == item: + if current.get_data() == item: found = True stop = True else: previous = current - current = current.getNext() + current = current.get_next() node = Node(inItem) - previous.setNext(node) - node.setNext(current) + previous.set_next(node) + node.set_next(current) def insertAfterItem(self, inItem, item): @@ -96,16 +96,16 @@ def insertAfterItem(self, inItem, item): stop = False while current != None and not found and not stop: - if current.getData() == item: + if current.get_data() == item: found = True stop = True else: # previous = current - current = current.getNext() - successor = current.getNext() + current = current.get_next() + successor = current.get_next() node = Node(inItem) - current.setNext(node) - node.setNext(successor) + current.set_next(node) + node.set_next(successor) @@ -115,8 +115,8 @@ def printList(self): current = self.head while current != None: - print current.getData() - current = current.getNext() + print current.get_data() + current = current.get_next() def remove(self, item): @@ -124,15 +124,15 @@ def remove(self, item): current = self.head previous = None - while current.getNext() != None and not found: - if current.getData() == item: - print current.getData() - print previous.getData() + while current.get_next() != None and not found: + if current.get_data() == item: + print current.get_data() + print previous.get_data() found = True - previous.setNext(current.next) + previous.set_next(current.next) else: previous = current - current = current.getNext() + current = current.get_next() def induceCycle(self, end, start): current = self.head @@ -144,33 +144,33 @@ def induceCycle(self, end, start): count += 1 if count == end: endnodeFound = True - endnodePointer = current.getNext() + endnodePointer = current.get_next() else: if count == start: stop = True else: - current = current.getNext() + current = current.get_next() - current.setNext(endnodePointer) + current.set_next(endnodePointer) def detectCycle(self): hare = self.head tortoise = self.head while (hare and tortoise): - hare = hare.getNext() + hare = hare.get_next() if (hare == tortoise): return True if hare == None: return False - hare = hare.getNext() + hare = hare.get_next() if (hare == tortoise): return True - tortoise = tortoise.getNext() + tortoise = tortoise.get_next() def detectCycleStart(self) : if None == self.head or None == self.head.next: diff --git a/src/chapter03linkedlists/FractionalNode.py b/src/chapter03linkedlists/FractionalNode.py index b06fa85..9b60379 100644 --- a/src/chapter03linkedlists/FractionalNode.py +++ b/src/chapter03linkedlists/FractionalNode.py @@ -13,16 +13,16 @@ def __init__(self, data): self.data = data self.next = None - def setData(self, data): + def set_data(self, data): self.data = data - def getData(self): + def get_data(self): return self.data - def setNext(self, next): + def set_next(self, next): self.next = next - def getNext(self): + def get_next(self): return self.next @@ -42,25 +42,25 @@ def fractionalNode(self, k): if fractionalNode == None: fractionalNode = self.head else: - fractionalNode = fractionalNode.getNext() + fractionalNode = fractionalNode.get_next() i = i + 1 - currentNode = currentNode.getNext() + currentNode = currentNode.get_next() - print (fractionalNode.getData()) + print (fractionalNode.get_data()) def insertAtEnd(self, item): current = self.head if current == None: node = Node(item) - node.setNext(None) + node.set_next(None) self.head = node return - while current.getNext() != None: - current = current.getNext() + while current.get_next() != None: + current = current.get_next() node = Node(item) - current.setNext(node) + current.set_next(node) if __name__ == "__main__": linkedlst = LinkedList() diff --git a/src/chapter03linkedlists/IsLinkedListLengthEven.py b/src/chapter03linkedlists/IsLinkedListLengthEven.py index ad6f53f..91697f6 100644 --- a/src/chapter03linkedlists/IsLinkedListLengthEven.py +++ b/src/chapter03linkedlists/IsLinkedListLengthEven.py @@ -13,16 +13,16 @@ def __init__(self, data): self.data = data self.next = None - def setData(self, data): + def set_data(self, data): self.data = data - def getData(self): + def get_data(self): return self.data - def setNext(self, next): + def set_next(self, next): self.next = next - def getNext(self): + def get_next(self): return self.next @@ -35,48 +35,48 @@ def recursiveReverseList(self) : def reverseRecursive(self, n) : if None != n: - right = n.getNext() + right = n.get_next() if self.head != n: - n.setNext(self.head) + n.set_next(self.head) self.head = n else: - n.setNext(None) + n.set_next(None) self.reverseRecursive(right) def printListFromEnd(self, list) : if list == None: return head = list - tail = list.getNext() + tail = list.get_next() self.printListFromEnd(tail) - print head.getData(), + print head.get_data(), def insertAtEnd(self, item): current = self.head if current == None: node = Node(item) - node.setNext(None) + node.set_next(None) self.head = node return - while current.getNext() != None: - current = current.getNext() + while current.get_next() != None: + current = current.get_next() node = Node(item) - current.setNext(node) + current.set_next(node) def printList(self): current = self.head while current != None: - print current.getData() - current = current.getNext() + print current.get_data() + current = current.get_next() def isLinkedListLengthEven(self): current = self.head - while current != None and current.getNext() != None: - current = current.getNext().getNext() + while current != None and current.get_next() != None: + current = current.get_next().get_next() if current == None: return 1 diff --git a/src/chapter03linkedlists/JosephusPosition.py b/src/chapter03linkedlists/JosephusPosition.py index c405a22..bfd2b30 100644 --- a/src/chapter03linkedlists/JosephusPosition.py +++ b/src/chapter03linkedlists/JosephusPosition.py @@ -11,22 +11,22 @@ def getJosephusPosition(n, m): class Node: def __init__(self, data=None, next=None): - self.setData(data) - self.setNext(next) + self.set_data(data) + self.set_next(next) # method for setting the data field of the node - def setData(self, data): + def set_data(self, data): self.data = data # method for getting the data field of the node - def getData(self): + def get_data(self): return self.data # method for setting the next field of the node - def setNext(self, next): + def set_next(self, next): self.next = next # method for getting the next field of the node - def getNext(self): + def get_next(self): return self.next # returns true if the node points to another node - def hasNext(self): + def has_next(self): return self.next != None answer = [] @@ -35,24 +35,24 @@ def hasNext(self): prev = head for n in range(1, n): currentNode = Node(n) - prev.setNext(currentNode) + prev.set_next(currentNode) prev = currentNode - prev.setNext(head) # set the last node to point to the front (circular list) + prev.set_next(head) # set the last node to point to the front (circular list) # extract items from linked list in proper order currentNode = head counter = 0 - while currentNode.getNext() != currentNode: + while currentNode.get_next() != currentNode: counter += 1 if counter == m: counter = 0 - prev.setNext(currentNode.next) - answer.append(currentNode.getData()) + prev.set_next(currentNode.next) + answer.append(currentNode.get_data()) else: prev = currentNode - currentNode = currentNode.getNext() + currentNode = currentNode.get_next() - answer.append(currentNode.getData()) + answer.append(currentNode.get_data()) return answer diff --git a/src/chapter03linkedlists/LinkedList.py b/src/chapter03linkedlists/LinkedList.py index 5adc47e..8eeb19d 100644 --- a/src/chapter03linkedlists/LinkedList.py +++ b/src/chapter03linkedlists/LinkedList.py @@ -15,19 +15,19 @@ def __init__(self, data): self.data = data self.next = None # method for setting the data field of the node - def setData(self, data): + def set_data(self, data): self.data = data # method for getting the data field of the node - def getData(self): + def get_data(self): return self.data # method for setting the next field of the node - def setNext(self, next): + def set_next(self, next): self.next = next # method for getting the next field of the node - def getNext(self): + def get_next(self): return self.next # returns true if the node points to another node - def hasNext(self): + def has_next(self): return self.next != None # class for defining a linked list @@ -158,6 +158,10 @@ def deleteAtPos(self, pos): if pos > self.length or pos < 0: print "The position does not exist. Please enter a valid position" + # to deletle the first position of the linkedlist + elif pos == 1: + self.delete_beg() + self.length -= 1 else: while currentnode.next != None or count < pos: count = count + 1 @@ -222,84 +226,6 @@ def print_list(self): print nodeList -class BSTNode: - def __init__(root, data=None): - root.left = None - root.right = None - root.data = data - -def insertNode(root, node): - if root is None: - root = node - else: - if root.data > node.data: - if root.left == None: - root.left = node - else: - insertNode(root.left, node) - else: - if root.right == None: - root.right = node - else: - insertNode(root.right, node) - -def deleteNode(root, data): - """ delete the node with the given data and return the root node of the tree """ - if root.data == data: - # found the node we need to delete - if root.right and root.left: - # get the successor node and its parent - [psucc, succ] = findMin(root.right, root) - # splice out the successor - # (we need the parent to do this) - if psucc.left == succ: - psucc.left = succ.right - else: - psucc.right = succ.right - # reset the left and right children of the successor - succ.left = root.left - succ.right = root.right - return succ - else: - # "easier" case - if root.left: - return root.left # promote the left subtree - else: - return root.right # promote the right subtree - else: - if root.data > data: # data should be in the left subtree - if root.left: - root.left = deleteNode(root.left, data) - # else the data is not in the tree - else: # data should be in the right subtree - if root.right: - root.right = deleteNode(root.right, data) - return root - -def findMin(root, parent): - """ return the minimum node in the current tree and its parent """ - # we use an ugly trick: the parent node is passed in as an argument - # so that eventually when the leftmost child is reached, the - # call can return both the parent to the successor and the successor - if root.left: - return findMin(root.left, root) - else: - return [parent, root] - -def inOrderTraversal(root): - if not root: - return - inOrderTraversal(root.left) - print root.data - inOrderTraversal(root.right) - -def preOrderTraversal(root): - if not root: - return - print root.data - preOrderTraversal(root.left) - preOrderTraversal(root.right) - node1 = Node(1) node2 = Node(2) node3 = Node(3) diff --git a/src/chapter03linkedlists/MergeTwoLists.py b/src/chapter03linkedlists/MergeTwoLists.py index 0a744af..cc8f3ad 100644 --- a/src/chapter03linkedlists/MergeTwoLists.py +++ b/src/chapter03linkedlists/MergeTwoLists.py @@ -12,15 +12,15 @@ def mergeTwoLists(self, list1, list2): temp = Node() pointer = temp while list1 != None and list2 != None: - if list1.getData() < list2.getData(): - pointer.setNext(list1) - list1 = list1.getNext() + if list1.get_data() < list2.get_data(): + pointer.set_next(list1) + list1 = list1.get_next() else: - pointer.setNext(list2) - list2 = list2.getNext() - pointer = pointer.getNext() + pointer.set_next(list2) + list2 = list2.get_next() + pointer = pointer.get_next() if list1 == None: - pointer.setNext(list2) + pointer.set_next(list2) else: - pointer.setNext(list1) - return temp.getNext() + pointer.set_next(list1) + return temp.get_next() diff --git a/src/chapter03linkedlists/MergeTwoSortedLists.py b/src/chapter03linkedlists/MergeTwoSortedLists.py index 767ae58..81901c2 100644 --- a/src/chapter03linkedlists/MergeTwoSortedLists.py +++ b/src/chapter03linkedlists/MergeTwoSortedLists.py @@ -12,15 +12,15 @@ def mergeTwoSortedLists(self, list1, list2): temp = Node(0) pointer = temp while list1 != None and list2 != None: - if list1.getData() < list2.getData(): - pointer.setNext(list1) - list1 = list1.getNext() + if list1.get_data() < list2.get_data(): + pointer.set_next(list1) + list1 = list1.get_next() else: - pointer.setNext(list2) - list2 = list2.getNext() - pointer = pointer.getNext() + pointer.set_next(list2) + list2 = list2.get_next() + pointer = pointer.get_next() if list1 == None: - pointer.setNext(list2) + pointer.set_next(list2) else: - pointer.setNext(list1) - return temp.getNext() + pointer.set_next(list1) + return temp.get_next() diff --git a/src/chapter03linkedlists/ModularNodeFromBegin.py b/src/chapter03linkedlists/ModularNodeFromBegin.py index 8f4efc2..d468936 100644 --- a/src/chapter03linkedlists/ModularNodeFromBegin.py +++ b/src/chapter03linkedlists/ModularNodeFromBegin.py @@ -13,16 +13,16 @@ def __init__(self, data): self.data = data self.next = None - def setData(self, data): + def set_data(self, data): self.data = data - def getData(self): + def get_data(self): return self.data - def setNext(self, next): + def set_next(self, next): self.next = next - def getNext(self): + def get_next(self): return self.next @@ -40,22 +40,22 @@ def modularNodeFromBegin(self, k): if i % k == 0: modularNode = currentNode i = i + 1 - currentNode = currentNode.getNext() - print (modularNode.getData()) + currentNode = currentNode.get_next() + print (modularNode.get_data()) def insertAtEnd(self, item): current = self.head if current == None: node = Node(item) - node.setNext(None) + node.set_next(None) self.head = node return - while current.getNext() != None: - current = current.getNext() + while current.get_next() != None: + current = current.get_next() node = Node(item) - current.setNext(node) + current.set_next(node) if __name__ == "__main__": linkedlst = LinkedList() diff --git a/src/chapter03linkedlists/ModularNodeFromEnd.py b/src/chapter03linkedlists/ModularNodeFromEnd.py index e72d41e..d748aa5 100644 --- a/src/chapter03linkedlists/ModularNodeFromEnd.py +++ b/src/chapter03linkedlists/ModularNodeFromEnd.py @@ -13,16 +13,16 @@ def __init__(self, data): self.data = data self.next = None - def setData(self, data): + def set_data(self, data): self.data = data - def getData(self): + def get_data(self): return self.data - def setNext(self, next): + def set_next(self, next): self.next = next - def getNext(self): + def get_next(self): return self.next @@ -40,10 +40,10 @@ def modularNodeFromBegin(self, k): if i % k == 0: modularNode = currentNode i = i + 1 - currentNode = currentNode.getNext() - print (modularNode.getData()) + currentNode = currentNode.get_next() + print (modularNode.get_data()) - def modularNodeFromEnd(self, k): + def modular_node_from_end(self, k): currentNode = self.head modularNode = self.head i = 1 @@ -52,29 +52,29 @@ def modularNodeFromEnd(self, k): while i < k and currentNode != None: i = i + 1 - currentNode = currentNode.getNext() + currentNode = currentNode.get_next() if currentNode == None: return while currentNode != None: - modularNode = modularNode.getNext() - currentNode = currentNode.getNext() + modularNode = modularNode.get_next() + currentNode = currentNode.get_next() - print (modularNode.getData()) + print (modularNode.get_data()) def insertAtEnd(self, item): current = self.head if current == None: node = Node(item) - node.setNext(None) + node.set_next(None) self.head = node return - while current.getNext() != None: - current = current.getNext() + while current.get_next() != None: + current = current.get_next() node = Node(item) - current.setNext(node) + current.set_next(node) if __name__ == "__main__": linkedlst = LinkedList() @@ -82,4 +82,4 @@ def insertAtEnd(self, item): linkedlst.insertAtEnd(2) linkedlst.insertAtEnd(3) linkedlst.insertAtEnd(4) - linkedlst.modularNodeFromEnd(4) + linkedlst.modular_node_from_end(4) diff --git a/src/chapter03linkedlists/OrderedInsertLinkedList.py b/src/chapter03linkedlists/OrderedInsertLinkedList.py index ad3308d..d6ff9cc 100644 --- a/src/chapter03linkedlists/OrderedInsertLinkedList.py +++ b/src/chapter03linkedlists/OrderedInsertLinkedList.py @@ -13,16 +13,16 @@ def orderedInsert(self, item): previous = None stop = False while current != None and not stop: - if current.getData() > item: + if current.get_data() > item: stop = True else: previous = current - current = current.getNext() + current = current.get_next() temp = Node(item) if previous == None: - temp.setNext(self.head) + temp.set_next(self.head) self.head = temp else: - temp.setNext(current) - previous.setNext(temp) + temp.set_next(current) + previous.set_next(temp) diff --git a/src/chapter03linkedlists/PrintListFromEndRecursive.py b/src/chapter03linkedlists/PrintListFromEndRecursive.py index 44f10b8..9a87e24 100644 --- a/src/chapter03linkedlists/PrintListFromEndRecursive.py +++ b/src/chapter03linkedlists/PrintListFromEndRecursive.py @@ -13,16 +13,16 @@ def __init__(self, data): self.data = data self.next = None - def setData(self, data): + def set_data(self, data): self.data = data - def getData(self): + def get_data(self): return self.data - def setNext(self, next): + def set_next(self, next): self.next = next - def getNext(self): + def get_next(self): return self.next @@ -35,42 +35,42 @@ def recursiveReverseList(self) : def reverseRecursive(self, n) : if None != n: - right = n.getNext() + right = n.get_next() if self.head != n: - n.setNext(self.head) + n.set_next(self.head) self.head = n else: - n.setNext(None) + n.set_next(None) self.reverseRecursive(right) def printListFromEnd(self, list) : if list == None: return head = list - tail = list.getNext() + tail = list.get_next() self.printListFromEnd(tail) - print head.getData(), + print head.get_data(), def insertAtEnd(self, item): current = self.head if current == None: node = Node(item) - node.setNext(None) + node.set_next(None) self.head = node return - while current.getNext() != None: - current = current.getNext() + while current.get_next() != None: + current = current.get_next() node = Node(item) - current.setNext(node) + current.set_next(node) def printList(self): current = self.head while current != None: - print current.getData() - current = current.getNext() + print current.get_data() + current = current.get_next() diff --git a/src/chapter03linkedlists/PrintReverse.py b/src/chapter03linkedlists/PrintReverse.py index 86b294a..efa4548 100644 --- a/src/chapter03linkedlists/PrintReverse.py +++ b/src/chapter03linkedlists/PrintReverse.py @@ -13,16 +13,16 @@ def __init__(self, value): self.data = value self.next = None - def getData(self): + def get_data(self): return self.data - def getNext(self): + def get_next(self): return self.next - def setData(self, value): + def set_data(self, value): self.data = value - def setNext(self, newnext): + def set_next(self, newnext): self.next = newnext def ListLength(self): @@ -30,7 +30,7 @@ def ListLength(self): count = 0 while current != None: count = count + 1 - current = current.getNext() + current = current.get_next() return count diff --git a/src/chapter03linkedlists/ReverseInPairs.py b/src/chapter03linkedlists/ReverseInPairs.py index cd376d7..2319db5 100644 --- a/src/chapter03linkedlists/ReverseInPairs.py +++ b/src/chapter03linkedlists/ReverseInPairs.py @@ -10,11 +10,11 @@ def reverseInPairs(self) : temp = self.head - while None != temp and None != temp.getNext(): - self.swapData(temp, temp.getNext()) - temp = temp.getNext().getNext() + while None != temp and None != temp.get_next(): + self.swapData(temp, temp.get_next()) + temp = temp.get_next().get_next() def swapData(self, a, b): - tmp = a.getData() - a.setData(b.getData()) - b.setData(tmp) + tmp = a.get_data() + a.set_data(b.get_data()) + b.set_data(tmp) diff --git a/src/chapter03linkedlists/ReverseKBlock.py b/src/chapter03linkedlists/ReverseKBlock.py index 65fad79..c5a6d12 100644 --- a/src/chapter03linkedlists/ReverseKBlock.py +++ b/src/chapter03linkedlists/ReverseKBlock.py @@ -10,27 +10,27 @@ def reverseKBlock(self, head, k): temp = Node(0); - temp.setNext(head) + temp.set_next(head) previous = temp while True: - begin = previous.getNext() + begin = previous.get_next() end = previous for i in range(0, k): - end = end.getNext() + end = end.get_next() if end == None: - return temp.getNext() - nextBlock = end.getNext() + return temp.get_next() + nextBlock = end.get_next() self.reverseList(begin, end) - previous.setNext(end) - begin.setNext(nextBlock) + previous.set_next(end) + begin.set_next(nextBlock) previous = begin def reverseList(self, start, end): alreadyReversed = start actual = start - nextNode = start.getNext() + nextNode = start.get_next() while actual != end: actual = nextNode - nextNode = nextNode.getNext() - actual.setNext(alreadyReversed) + nextNode = nextNode.get_next() + actual.set_next(alreadyReversed) alreadyReversed = actual diff --git a/src/chapter03linkedlists/ReverseListIterative.py b/src/chapter03linkedlists/ReverseListIterative.py index 8604fd4..b9a19db 100644 --- a/src/chapter03linkedlists/ReverseListIterative.py +++ b/src/chapter03linkedlists/ReverseListIterative.py @@ -13,16 +13,16 @@ def __init__(self, data): self.data = data self.next = None - def setData(self, data): + def set_data(self, data): self.data = data - def getData(self): + def get_data(self): return self.data - def setNext(self, next): + def set_next(self, next): self.next = next - def getNext(self): + def get_next(self): return self.next @@ -38,8 +38,8 @@ def reverseList(self): current = self.head while(current is not None): - nextNode = current.getNext() - current.setNext(last) + nextNode = current.get_next() + current.set_next(last) last = current current = nextNode @@ -49,22 +49,22 @@ def insertAtEnd(self, item): current = self.head if current == None: node = Node(item) - node.setNext(None) + node.set_next(None) self.head = node return - while current.getNext() != None: - current = current.getNext() + while current.get_next() != None: + current = current.get_next() node = Node(item) - current.setNext(node) + current.set_next(node) def printList(self): current = self.head while current != None: - print current.getData() - current = current.getNext() + print current.get_data() + current = current.get_next() diff --git a/src/chapter03linkedlists/ReverseListRecursive.py b/src/chapter03linkedlists/ReverseListRecursive.py index 7921be2..bf1c688 100644 --- a/src/chapter03linkedlists/ReverseListRecursive.py +++ b/src/chapter03linkedlists/ReverseListRecursive.py @@ -13,16 +13,16 @@ def __init__(self, data): self.data = data self.next = None - def setData(self, data): + def set_data(self, data): self.data = data - def getData(self): + def get_data(self): return self.data - def setNext(self, next): + def set_next(self, next): self.next = next - def getNext(self): + def get_next(self): return self.next @@ -35,34 +35,34 @@ def recursiveReverseList(self) : def reverseRecursive(self, n) : if None != n: - right = n.getNext() + right = n.get_next() if self.head != n: - n.setNext(self.head) + n.set_next(self.head) self.head = n else: - n.setNext(None) + n.set_next(None) self.reverseRecursive(right) def insertAtEnd(self, item): current = self.head if current == None: node = Node(item) - node.setNext(None) + node.set_next(None) self.head = node return - while current.getNext() != None: - current = current.getNext() + while current.get_next() != None: + current = current.get_next() node = Node(item) - current.setNext(node) + current.set_next(node) def printList(self): current = self.head while current != None: - print current.getData() - current = current.getNext() + print current.get_data() + current = current.get_next() diff --git a/src/chapter03linkedlists/SortedLinikedListToBST.py b/src/chapter03linkedlists/SortedLinikedListToBST.py index 68ac31e..ac3a1b7 100644 --- a/src/chapter03linkedlists/SortedLinikedListToBST.py +++ b/src/chapter03linkedlists/SortedLinikedListToBST.py @@ -15,19 +15,19 @@ def __init__(self, data): self.data = data self.next = None # method for setting the data field of the node - def setData(self, data): + def set_data(self, data): self.data = data # method for getting the data field of the node - def getData(self): + def get_data(self): return self.data # method for setting the next field of the node - def setNext(self, next): + def set_next(self, next): self.next = next # method for getting the next field of the node - def getNext(self): + def get_next(self): return self.next # returns true if the node points to another node - def hasNext(self): + def has_next(self): return self.next != None # class for defining a linked list diff --git a/src/chapter03linkedlists/SplitList.py b/src/chapter03linkedlists/SplitList.py index 721ab99..57e26f2 100644 --- a/src/chapter03linkedlists/SplitList.py +++ b/src/chapter03linkedlists/SplitList.py @@ -17,31 +17,31 @@ def __init__(self): self.data = None self.next = None # method for setting the data field of the node - def setData(self, data): + def set_data(self, data): self.data = data # method for getting the data field of the node - def getData(self): + def get_data(self): return self.data # method for setting the next field of the node - def setNext(self, next): + def set_next(self, next): self.next = next # method for getting the next field of the node - def getNext(self): + def get_next(self): return self.next # returns true if the node points to another node - def hasNext(self): + def has_next(self): return self.next != None def _splitList(head): fast = head slow = head while fast and fast.next: - slow = slow.getNext() - fast = fast.getNext() - fast = fast.getNext() + slow = slow.get_next() + fast = fast.get_next() + fast = fast.get_next() - middle = slow.getNext() - slow.setNext(None) + middle = slow.get_next() + slow.set_next(None) return head, middle @@ -53,8 +53,8 @@ def _reverseList(head): currentNode = head while currentNode: - nextNode = currentNode.getNext() - currentNode.setNext(last) + nextNode = currentNode.get_next() + currentNode.set_next(last) last = currentNode currentNode = nextNode @@ -64,11 +64,11 @@ def _reverseList(head): def _mergeLists(a, b): tail = a head = a - a = a.getNext() + a = a.get_next() while b: - tail.setNext(b) - tail = tail.getNext() - b = b.getNext() + tail.set_next(b) + tail = tail.get_next() + b = b.get_next() if a: a, b = b, a return head diff --git a/src/chapter03linkedlists/SqrtNodes.py b/src/chapter03linkedlists/SqrtNodes.py index f8625a4..c4c52e0 100644 --- a/src/chapter03linkedlists/SqrtNodes.py +++ b/src/chapter03linkedlists/SqrtNodes.py @@ -13,16 +13,16 @@ def __init__(self, data): self.data = data self.next = None - def setData(self, data): + def set_data(self, data): self.data = data - def getData(self): + def get_data(self): return self.data - def setNext(self, next): + def set_next(self, next): self.next = next - def getNext(self): + def get_next(self): return self.next @@ -39,26 +39,26 @@ def sqrtNodes(self): if sqrtNode == None: sqrtNode = self.head else: - sqrtNode = sqrtNode.getNext() + sqrtNode = sqrtNode.get_next() j = j + 1 i = i + 1 - currentNode = currentNode.getNext() + currentNode = currentNode.get_next() - print (sqrtNode.getData()) + print (sqrtNode.get_data()) def insertAtEnd(self, item): current = self.head if current == None: node = Node(item) - node.setNext(None) + node.set_next(None) self.head = node return - while current.getNext() != None: - current = current.getNext() + while current.get_next() != None: + current = current.get_next() node = Node(item) - current.setNext(node) + current.set_next(node) if __name__ == "__main__": linkedlst = LinkedList() diff --git a/src/chapter04stacks/ReverseQueueWithStack.py b/src/chapter04stacks/ReverseQueueWithStack.py index 5f82a7d..83b10d1 100644 --- a/src/chapter04stacks/ReverseQueueWithStack.py +++ b/src/chapter04stacks/ReverseQueueWithStack.py @@ -47,16 +47,16 @@ def __init__(self, data=None, next=None): self.last = None self.next = next # method for setting the data field of the node - def setData(self, data): + def set_data(self, data): self.data = data # method for getting the data field of the node - def getData(self): + def get_data(self): return self.data # method for setting the next field of the node - def setNext(self, next): + def set_next(self, next): self.next = next # method for getting the next field of the node - def getNext(self): + def get_next(self): return self.next # method for setting the last field of the node def setLast(self, last): @@ -65,7 +65,7 @@ def setLast(self, last): def getLast(self): return self.last # returns true if the node points to another node - def hasNext(self): + def has_next(self): return self.next != None @@ -88,19 +88,19 @@ def queueRear(self): if self.rear is None: print "Sorry, the queue is empty!" raise IndexError - return self.rear.getData() + return self.rear.get_data() def queueFront(self): if self.front is None: print "Sorry, the queue is empty!" raise IndexError - return self.front.getData() + return self.front.get_data() def deQueue(self): if self.rear is None: print "Sorry, the queue is empty!" raise IndexError - result = self.rear.getData() + result = self.rear.get_data() self.rear = self.rear.last self.size -= 1 return result diff --git a/src/chapter04stacks/StackWithLinkedList.py b/src/chapter04stacks/StackWithLinkedList.py index 4f77711..11b7203 100644 --- a/src/chapter04stacks/StackWithLinkedList.py +++ b/src/chapter04stacks/StackWithLinkedList.py @@ -15,19 +15,19 @@ def __init__(self): self.data = None self.next = None # method for setting the data field of the node - def setData(self, data): + def set_data(self, data): self.data = data # method for getting the data field of the node - def getData(self): + def get_data(self): return self.data # method for setting the next field of the node - def setNext(self, next): + def set_next(self, next): self.next = next # method for getting the next field of the node - def getNext(self): + def get_next(self): return self.next # returns true if the node points to another node - def hasNext(self): + def has_next(self): return self.next != None class Stack(object): @@ -39,21 +39,21 @@ def __init__(self, data=None): def push(self, data): temp = Node() - temp.setData(data) - temp.setNext(self.head) + temp.set_data(data) + temp.set_next(self.head) self.head = temp def pop(self): if self.head is None: raise IndexError - temp = self.head.getData() - self.head = self.head.getNext() + temp = self.head.get_data() + self.head = self.head.get_next() return temp def peek(self): if self.head is None: raise IndexError - return self.head.getData() + return self.head.get_data() our_list = ["first", "second", "third", "fourth"] diff --git a/src/chapter04stacks/checkStackPairwiseOrder.py b/src/chapter04stacks/checkStackPairwiseOrder.py index 5531771..d186518 100644 --- a/src/chapter04stacks/checkStackPairwiseOrder.py +++ b/src/chapter04stacks/checkStackPairwiseOrder.py @@ -48,16 +48,16 @@ def __init__(self, data=None, next=None): self.last = None self.next = next # method for setting the data field of the node - def setData(self, data): + def set_data(self, data): self.data = data # method for getting the data field of the node - def getData(self): + def get_data(self): return self.data # method for setting the next field of the node - def setNext(self, next): + def set_next(self, next): self.next = next # method for getting the next field of the node - def getNext(self): + def get_next(self): return self.next # method for setting the last field of the node def setLast(self, last): @@ -66,7 +66,7 @@ def setLast(self, last): def getLast(self): return self.last # returns true if the node points to another node - def hasNext(self): + def has_next(self): return self.next != None @@ -89,19 +89,19 @@ def queueRear(self): if self.rear is None: print "Sorry, the queue is empty!" raise IndexError - return self.rear.getData() + return self.rear.get_data() def queueFront(self): if self.front is None: print "Sorry, the queue is empty!" raise IndexError - return self.front.getData() + return self.front.get_data() def deQueue(self): if self.rear is None: print "Sorry, the queue is empty!" raise IndexError - result = self.rear.getData() + result = self.rear.get_data() self.rear = self.rear.last self.size -= 1 return result diff --git a/src/chapter04stacks/largestHistrogram_n^2.py b/src/chapter04stacks/largestHistrogram_n^2.py new file mode 100644 index 0000000..a6696a3 --- /dev/null +++ b/src/chapter04stacks/largestHistrogram_n^2.py @@ -0,0 +1,13 @@ + +def largestHistrogram(A): + maxArea = 0 + for i in range(len(A)): + minimum_height = A[i] + for j in range(i, len(A)): + minimum_height = min(minimum_height, A[j]) + maxArea = max(maxArea, (j-i+1) * minimum_height) + return maxArea + + +A = [6, 2, 5, 4, 5, 1, 6] +print "largestRectangleArea: ", largestHistrogram(A) diff --git a/src/chapter04stacks/largestHistrogram_n^3.py b/src/chapter04stacks/largestHistrogram_n^3.py new file mode 100644 index 0000000..94eab6d --- /dev/null +++ b/src/chapter04stacks/largestHistrogram_n^3.py @@ -0,0 +1,21 @@ +def findMin(A, i, j): + min = A[i] + while i <= j: + if min > A[i]: + min = A[i] + i = i + 1 + return min + +def largestHistrogram(A): + maxArea = 0 + print A + for i in range(len(A)): + for j in range(i, len(A)): + minimum_height = A[i] + minimum_height = findMin(A, i, j) + maxArea = max(maxArea, (j-i+1) * minimum_height) + return maxArea + + +A = [6, 2, 5, 4, 5, 1, 6] +print "largestRectangleArea: ", largestHistrogram(A) diff --git a/src/chapter04stacks/minimuminstack.py b/src/chapter04stacks/minimuminstack.py new file mode 100644 index 0000000..637f85e --- /dev/null +++ b/src/chapter04stacks/minimuminstack.py @@ -0,0 +1,65 @@ +# Copyright (c) Oct 22, 2018 CareerMonk Publications and others. +# E-Mail : info@careermonk.com +# Creation Date : 2014-01-10 06:15:46 +# Last modification : 2008-10-31 +# by : Narasimha Karumanchi +# Book Title : Data Structures And Algorithmic Thinking With Python +# Warranty : This software is provided "as is" without any +# warranty; without even the implied warranty of +# merchantability or fitness for a particular purpose. +import random + +class Stack: + def __init__(self, C = 5): + self.C = C + self.array = [] + def size(self): + return len(self.array) + def isEmpty(self): + return len(self.array) == 0 + def isFull(self): + return len(self.array) == self.C + def peek(self): + if self.isEmpty(): + return None + return self.array[self.size()-1] + def pop(self): + if self.isEmpty(): + print "Underflow" + return None + data = self.array.pop() + return data + def push(self, data): + if self.isFull(): + print "Overflow" + return + self.array.append(data) + +class AdvStack: + def __init__(self): + self.dataStack = Stack() + self.minStack = Stack() + self.minElement = 100000 + def push(self, data): + self.dataStack.push(data) + if data < self.minElement: + self.minElement = data + self.minStack.push(self.minElement) + def pop(self): + self.minStack.pop() + data = self.dataStack.pop() + return data + def minimum(self): + return self.minStack.peek() + +testS = AdvStack() +testS.push(2) +print testS.minimum() +testS.push(1) +print testS.minimum() +testS.push(6) +print testS.minimum() +testS.pop() +print testS.minimum() +testS.pop() +print testS.minimum() diff --git a/src/chapter04stacks/queuewithstacks.py b/src/chapter04stacks/queuewithstacks.py new file mode 100644 index 0000000..69044c5 --- /dev/null +++ b/src/chapter04stacks/queuewithstacks.py @@ -0,0 +1,63 @@ +# Copyright (c) Oct 22, 2018 CareerMonk Publications and others. +# E-Mail : info@careermonk.com +# Creation Date : 2014-01-10 06:15:46 +# Last modification : 2008-10-31 +# by : Narasimha Karumanchi +# Book Title : Data Structures And Algorithmic Thinking With Python +# Warranty : This software is provided "as is" without any +# warranty; without even the implied warranty of +# merchantability or fitness for a particular purpose. + +import random + +class Stack: + def __init__(self, C = 5): + self.C = C + self.array = [] + def size(self): + return len(self.array) + def isEmpty(self): + return len(self.array) == 0 + def isFull(self): + return len(self.array) == self.C + def peek(self): + if self.isEmpty(): + return None + return self.array[self.size()-1] + def pop(self): + if self.isEmpty(): + print "Underflow" + return None + data = self.array.pop() + return data + def push(self, data): + if self.isFull(): + print "Overflow" + return + self.array.append(data) + +class Queue: + def __init__(self): + self.s1 = Stack() + self.s2 = Stack() + def enqueue(self, data): + self.s1.push(data) + + def dequeue(self): + if (not self.s2.isEmpty()): + return self.s2.pop() + while(not self.s1.isEmpty()): + self.s2.push(self.s1.pop()) + return self.s2.pop() + +q = Queue() +q.enqueue(1) +q.enqueue(6) +q.enqueue(8) +q.enqueue(10) +q.enqueue(16) +print q.dequeue() +print q.dequeue() +print q.dequeue() +print q.dequeue() +print q.dequeue() diff --git a/src/chapter04stacks/stack.py b/src/chapter04stacks/stack.py new file mode 100644 index 0000000..eb19705 --- /dev/null +++ b/src/chapter04stacks/stack.py @@ -0,0 +1,53 @@ +# Copyright (c) Oct 22, 2018 CareerMonk Publications and others. +# E-Mail : info@careermonk.com +# Creation Date : 2014-01-10 06:15:46 +# Last modification : 2008-10-31 +# by : Narasimha Karumanchi +# Book Title : Data Structures And Algorithmic Thinking With Python +# Warranty : This software is provided "as is" without any +# warranty; without even the implied warranty of +# merchantability or fitness for a particular purpose. + +import random + +class Stack: + def __init__(self, C = 5): + self.C = C + self.array = [] + def size(self): + return len(self.array) + def isEmpty(self): + return len(self.array) == 0 + def isFull(self): + return len(self.array) == self.C + def peek(self): + if self.isEmpty(): + return None + return self.array[self.size()-1] + def pop(self): + if self.isEmpty(): + print "Underflow" + return None + data = self.array.pop() + return data + def push(self, data): + if self.isFull(): + print "Overflow" + return + self.array.append(data) + +def testStack(stackCap): + stack = Stack(stackCap) + c = stackCap * 2 + while(c): + data = random.randrange(1,100) + print "Pushing ", data + stack.push(data) + c -= 1 + print "Stack size ", stack.size() + c = stackCap * 2 + while(c): + print "Popping", stack.pop() + c -= 1 + +print testStack(6) diff --git a/src/chapter05queues/InterLeavingQueue.py b/src/chapter05queues/InterLeavingQueue.py index 9adf1a4..d9cb963 100644 --- a/src/chapter05queues/InterLeavingQueue.py +++ b/src/chapter05queues/InterLeavingQueue.py @@ -49,16 +49,16 @@ def __init__(self, data=None, next=None): self.last = None self.next = next # method for setting the data field of the node - def setData(self, data): + def set_data(self, data): self.data = data # method for getting the data field of the node - def getData(self): + def get_data(self): return self.data # method for setting the next field of the node - def setNext(self, next): + def set_next(self, next): self.next = next # method for getting the next field of the node - def getNext(self): + def get_next(self): return self.next # method for setting the last field of the node def setLast(self, last): @@ -67,7 +67,7 @@ def setLast(self, last): def getLast(self): return self.last # returns true if the node points to another node - def hasNext(self): + def has_next(self): return self.next != None @@ -90,19 +90,19 @@ def queueRear(self): if self.rear is None: print "Sorry, the queue is empty!" raise IndexError - return self.rear.getData() + return self.rear.get_data() def queueFront(self): if self.front is None: print "Sorry, the queue is empty!" raise IndexError - return self.front.getData() + return self.front.get_data() def deQueue(self): if self.rear is None: print "Sorry, the queue is empty!" raise IndexError - result = self.rear.getData() + result = self.rear.get_data() self.rear = self.rear.last self.size -= 1 return result diff --git a/src/chapter05queues/QueuesWithLinkedLists.py b/src/chapter05queues/QueuesWithLinkedLists.py index 95f1fb3..8397e73 100644 --- a/src/chapter05queues/QueuesWithLinkedLists.py +++ b/src/chapter05queues/QueuesWithLinkedLists.py @@ -16,16 +16,16 @@ def __init__(self, data=None, next=None): self.last = None self.next = next # method for setting the data field of the node - def setData(self, data): + def set_data(self, data): self.data = data # method for getting the data field of the node - def getData(self): + def get_data(self): return self.data # method for setting the next field of the node - def setNext(self, next): + def set_next(self, next): self.next = next # method for getting the next field of the node - def getNext(self): + def get_next(self): return self.next # method for setting the last field of the node def setLast(self, last): @@ -34,7 +34,7 @@ def setLast(self, last): def getLast(self): return self.last # returns true if the node points to another node - def hasNext(self): + def has_next(self): return self.next != None @@ -57,19 +57,19 @@ def queueRear(self): if self.rear is None: print "Sorry, the queue is empty!" raise IndexError - return self.rear.getData() + return self.rear.get_data() def queueFront(self): if self.front is None: print "Sorry, the queue is empty!" raise IndexError - return self.front.getData() + return self.front.get_data() def deQueue(self): if self.rear is None: print "Sorry, the queue is empty!" raise IndexError - result = self.rear.getData() + result = self.rear.get_data() self.rear = self.rear.last self.size -= 1 return result diff --git a/src/chapter05queues/ReverseQueueFirstKElements.py b/src/chapter05queues/ReverseQueueFirstKElements.py index dc3465d..cc25ac6 100644 --- a/src/chapter05queues/ReverseQueueFirstKElements.py +++ b/src/chapter05queues/ReverseQueueFirstKElements.py @@ -49,16 +49,16 @@ def __init__(self, data=None, next=None): self.last = None self.next = next # method for setting the data field of the node - def setData(self, data): + def set_data(self, data): self.data = data # method for getting the data field of the node - def getData(self): + def get_data(self): return self.data # method for setting the next field of the node - def setNext(self, next): + def set_next(self, next): self.next = next # method for getting the next field of the node - def getNext(self): + def get_next(self): return self.next # method for setting the last field of the node def setLast(self, last): @@ -67,7 +67,7 @@ def setLast(self, last): def getLast(self): return self.last # returns true if the node points to another node - def hasNext(self): + def has_next(self): return self.next != None @@ -90,19 +90,19 @@ def queueRear(self): if self.rear is None: print "Sorry, the queue is empty!" raise IndexError - return self.rear.getData() + return self.rear.get_data() def queueFront(self): if self.front is None: print "Sorry, the queue is empty!" raise IndexError - return self.front.getData() + return self.front.get_data() def deQueue(self): if self.rear is None: print "Sorry, the queue is empty!" raise IndexError - result = self.rear.getData() + result = self.rear.get_data() self.rear = self.rear.last self.size -= 1 return result diff --git a/src/chapter05queues/ReverseQueueWithStack.py b/src/chapter05queues/ReverseQueueWithStack.py index 5f82a7d..83b10d1 100644 --- a/src/chapter05queues/ReverseQueueWithStack.py +++ b/src/chapter05queues/ReverseQueueWithStack.py @@ -47,16 +47,16 @@ def __init__(self, data=None, next=None): self.last = None self.next = next # method for setting the data field of the node - def setData(self, data): + def set_data(self, data): self.data = data # method for getting the data field of the node - def getData(self): + def get_data(self): return self.data # method for setting the next field of the node - def setNext(self, next): + def set_next(self, next): self.next = next # method for getting the next field of the node - def getNext(self): + def get_next(self): return self.next # method for setting the last field of the node def setLast(self, last): @@ -65,7 +65,7 @@ def setLast(self, last): def getLast(self): return self.last # returns true if the node points to another node - def hasNext(self): + def has_next(self): return self.next != None @@ -88,19 +88,19 @@ def queueRear(self): if self.rear is None: print "Sorry, the queue is empty!" raise IndexError - return self.rear.getData() + return self.rear.get_data() def queueFront(self): if self.front is None: print "Sorry, the queue is empty!" raise IndexError - return self.front.getData() + return self.front.get_data() def deQueue(self): if self.rear is None: print "Sorry, the queue is empty!" raise IndexError - result = self.rear.getData() + result = self.rear.get_data() self.rear = self.rear.last self.size -= 1 return result diff --git a/src/chapter05queues/queue.py b/src/chapter05queues/queue.py new file mode 100644 index 0000000..4007b26 --- /dev/null +++ b/src/chapter05queues/queue.py @@ -0,0 +1,48 @@ +# Copyright (c) Oct 22, 2018 CareerMonk Publications and others. +# E-Mail : info@careermonk.com +# Creation Date : 2014-01-10 06:15:46 +# Last modification : 2008-10-31 +# by : Narasimha Karumanchi +# Book Title : Data Structures And Algorithmic Thinking With Python +# Warranty : This software is provided "as is" without any +# warranty; without even the implied warranty of +# merchantability or fitness for a particular purpose. + +import random + +class Queue: + def __init__(self): + self.array = [] + def size(self): + return len(self.array) + def isEmpty(self): + return len(self.array) == 0 + def front(self): + if self.isEmpty(): + return None + return self.array[0] + def dequeue(self): + if self.isEmpty(): + print "Underflow" + return None + data = self.array[0] + self.array.remove(data) + return data + def enqueue(self, data): + self.array.append(data) + +def testQueue(): + q = Queue() + c = 5 + while(c): + data = random.randrange(1,100) + print "Enqueuing ", data + q.enqueue(data) + c -= 1 + print "Queue size ", q.size() + c = 5 + while(c): + print "Dequeueing", q.dequeue() + c -= 1 + +print testQueue() diff --git a/src/chapter05queues/queuewithstacks.py b/src/chapter05queues/queuewithstacks.py new file mode 100644 index 0000000..69044c5 --- /dev/null +++ b/src/chapter05queues/queuewithstacks.py @@ -0,0 +1,63 @@ +# Copyright (c) Oct 22, 2018 CareerMonk Publications and others. +# E-Mail : info@careermonk.com +# Creation Date : 2014-01-10 06:15:46 +# Last modification : 2008-10-31 +# by : Narasimha Karumanchi +# Book Title : Data Structures And Algorithmic Thinking With Python +# Warranty : This software is provided "as is" without any +# warranty; without even the implied warranty of +# merchantability or fitness for a particular purpose. + +import random + +class Stack: + def __init__(self, C = 5): + self.C = C + self.array = [] + def size(self): + return len(self.array) + def isEmpty(self): + return len(self.array) == 0 + def isFull(self): + return len(self.array) == self.C + def peek(self): + if self.isEmpty(): + return None + return self.array[self.size()-1] + def pop(self): + if self.isEmpty(): + print "Underflow" + return None + data = self.array.pop() + return data + def push(self, data): + if self.isFull(): + print "Overflow" + return + self.array.append(data) + +class Queue: + def __init__(self): + self.s1 = Stack() + self.s2 = Stack() + def enqueue(self, data): + self.s1.push(data) + + def dequeue(self): + if (not self.s2.isEmpty()): + return self.s2.pop() + while(not self.s1.isEmpty()): + self.s2.push(self.s1.pop()) + return self.s2.pop() + +q = Queue() +q.enqueue(1) +q.enqueue(6) +q.enqueue(8) +q.enqueue(10) +q.enqueue(16) +print q.dequeue() +print q.dequeue() +print q.dequeue() +print q.dequeue() +print q.dequeue() diff --git a/src/chapter06trees/BSTFind.py b/src/chapter06trees/BSTFind.py index 2bdfa4a..648ee32 100644 --- a/src/chapter06trees/BSTFind.py +++ b/src/chapter06trees/BSTFind.py @@ -12,9 +12,9 @@ def Find(self, root, data): currentNode = root while currentNode: - if data == currentNode.getData(): + if data == currentNode.get_data(): return currentNode - if key < currentNode.getData(): + if key < currentNode.get_data(): currentNode = currentNode.getLeft() else: currentNode = currentNode.getRight() diff --git a/src/chapter06trees/BinaryTree.py b/src/chapter06trees/BinaryTree.py index 741182a..3d90e9e 100644 --- a/src/chapter06trees/BinaryTree.py +++ b/src/chapter06trees/BinaryTree.py @@ -15,10 +15,10 @@ def __init__(self, data): self.left = None # left child self.right = None # right child # set data - def setData(self, data): + def set_data(self, data): self.data = data # get data - def getData(self): + def get_data(self): return self.data # get left child of a node def getLeft(self): @@ -136,7 +136,7 @@ def levelOrder(root, result): while not q.empty(): n = q.get() # dequeue FIFO - result.append(node.getData()) + result.append(node.get_data()) if n.left is not None: q.put(n.left) @@ -144,13 +144,13 @@ def levelOrder(root, result): q.put(n.right) root = BinaryTree(11) -print(root.getData()) +print(root.get_data()) root.insertLeft(1) root.insertLeft(10) root.insertLeft(1100) -print(root.getLeft().getData()) +print(root.getLeft().get_data()) root.insertRight(5) -print(root.getRight().getData()) -root.getRight().setData(2) -print(root.getRight().getData()) +print(root.getRight().get_data()) +root.getRight().set_data(2) +print(root.getRight().get_data()) diff --git a/src/chapter06trees/BinaryTreeTraversals.py b/src/chapter06trees/BinaryTreeTraversals.py index ae3fbb2..f2f5eff 100644 --- a/src/chapter06trees/BinaryTreeTraversals.py +++ b/src/chapter06trees/BinaryTreeTraversals.py @@ -15,10 +15,10 @@ def __init__(self, data): self.left = None # left child self.right = None # right child # set data - def setData(self, data): + def set_data(self, data): self.data = data # get data - def getData(self): + def get_data(self): return self.data # get left child of a node def getLeft(self): @@ -58,7 +58,6 @@ def postorderRecursive(root, result): def preorderIterative(root, result): if not root: return - stack = [] stack.append(root) while stack: @@ -71,7 +70,6 @@ def preorderIterative(root, result): def inorderIterative(root, result): if not root: return - stack = [] node = root while stack or node: @@ -84,27 +82,24 @@ def inorderIterative(root, result): node = node.right # Post-order iterative traversal. The nodes' values are appended to the result list in traversal order -def postorderIterative(root, result): - if not root: - return - +def postorderTraversal(root, result): + result = [] visited = set() stack = [] - node = root - while stack or node: - if node: - stack.append(node) - node = node.left + if root != None: + stack.append(root) + while len(stack)>0: + node = stack.pop() + if node in used: + result.append(node.val) else: - node = stack.pop() - if node.right and not node.right in visited: - stack.append(node) - node = node.right - else: - visited.add(node) - result.append(node.data) - node = None - + visited.add(node) + stack.append(node) + if node.right != None: + stack.append(node.right) + if node.left != None: + stack.append(node.left) + def levelOrder (root): Q = Queue() if(root == None): diff --git a/src/chapter06trees/BuildTreeFromPreOrder.py b/src/chapter06trees/BuildTreeFromPreOrder.py index 9f77ace..c3d8165 100644 --- a/src/chapter06trees/BuildTreeFromPreOrder.py +++ b/src/chapter06trees/BuildTreeFromPreOrder.py @@ -15,10 +15,10 @@ def __init__(self, data): self.left = None # left child self.right = None # right child # set data - def setData(self, data): + def set_data(self, data): self.data = data # get data - def getData(self): + def get_data(self): return self.data # get left child of a node def getLeft(self): diff --git a/src/chapter06trees/ClosestInBSTWithLevelOrder.py b/src/chapter06trees/ClosestInBSTWithLevelOrder.py index f83280d..8a90fac 100644 --- a/src/chapter06trees/ClosestInBSTWithLevelOrder.py +++ b/src/chapter06trees/ClosestInBSTWithLevelOrder.py @@ -16,16 +16,16 @@ def __init__(self, data=None, next=None): self.last = None self.next = next # method for setting the data field of the node - def setData(self, data): + def set_data(self, data): self.data = data # method for getting the data field of the node - def getData(self): + def get_data(self): return self.data # method for setting the next field of the node - def setNext(self, next): + def set_next(self, next): self.next = next # method for getting the next field of the node - def getNext(self): + def get_next(self): return self.next # method for setting the last field of the node def setLast(self, last): @@ -34,7 +34,7 @@ def setLast(self, last): def getLast(self): return self.last # returns true if the node points to another node - def hasNext(self): + def has_next(self): return self.next != None @@ -47,21 +47,21 @@ def __init__(self, data=None): def push(self, data): temp = Node() - temp.setData(data) - temp.setNext(self.head) + temp.set_data(data) + temp.set_next(self.head) self.head = temp def pop(self): if self.head is None: raise IndexError - temp = self.head.getData() - self.head = self.head.getNext() + temp = self.head.get_data() + self.head = self.head.get_next() return temp def peek(self): if self.head is None: raise IndexError - return self.head.getData() + return self.head.get_data() def isEmpty(self): return self.head == None @@ -85,19 +85,19 @@ def queueRear(self): if self.rear is None: print "Sorry, the queue is empty!" raise IndexError - return self.rear.getData() + return self.rear.get_data() def queueFront(self): if self.front is None: print "Sorry, the queue is empty!" raise IndexError - return self.front.getData() + return self.front.get_data() def deQueue(self): if self.rear is None: print "Sorry, the queue is empty!" raise IndexError - result = self.rear.getData() + result = self.rear.get_data() self.rear = self.rear.last self.size -= 1 return result diff --git a/src/chapter06trees/ClosestInBSTWithRecursive.py b/src/chapter06trees/ClosestInBSTWithRecursive.py index 491e74e..f638e50 100644 --- a/src/chapter06trees/ClosestInBSTWithRecursive.py +++ b/src/chapter06trees/ClosestInBSTWithRecursive.py @@ -16,16 +16,16 @@ def __init__(self, data=None, next=None): self.last = None self.next = next # method for setting the data field of the node - def setData(self, data): + def set_data(self, data): self.data = data # method for getting the data field of the node - def getData(self): + def get_data(self): return self.data # method for setting the next field of the node - def setNext(self, next): + def set_next(self, next): self.next = next # method for getting the next field of the node - def getNext(self): + def get_next(self): return self.next # method for setting the last field of the node def setLast(self, last): @@ -34,7 +34,7 @@ def setLast(self, last): def getLast(self): return self.last # returns true if the node points to another node - def hasNext(self): + def has_next(self): return self.next != None @@ -47,21 +47,21 @@ def __init__(self, data=None): def push(self, data): temp = Node() - temp.setData(data) - temp.setNext(self.head) + temp.set_data(data) + temp.set_next(self.head) self.head = temp def pop(self): if self.head is None: raise IndexError - temp = self.head.getData() - self.head = self.head.getNext() + temp = self.head.get_data() + self.head = self.head.get_next() return temp def peek(self): if self.head is None: raise IndexError - return self.head.getData() + return self.head.get_data() def isEmpty(self): return self.head == None @@ -85,19 +85,19 @@ def queueRear(self): if self.rear is None: print "Sorry, the queue is empty!" raise IndexError - return self.rear.getData() + return self.rear.get_data() def queueFront(self): if self.front is None: print "Sorry, the queue is empty!" raise IndexError - return self.front.getData() + return self.front.get_data() def deQueue(self): if self.rear is None: print "Sorry, the queue is empty!" raise IndexError - result = self.rear.getData() + result = self.rear.get_data() self.rear = self.rear.last self.size -= 1 return result diff --git a/src/chapter06trees/CountChildrenGenericBinaryTree.py b/src/chapter06trees/CountChildrenGenericBinaryTree.py index 9cedc8e..2eef83e 100644 --- a/src/chapter06trees/CountChildrenGenericBinaryTree.py +++ b/src/chapter06trees/CountChildrenGenericBinaryTree.py @@ -15,10 +15,10 @@ def __init__(self, data): self.firstChild = None # left child self.nextSibling = None # right child # set data - def setData(self, data): + def set_data(self, data): self.data = data # get data - def getData(self): + def get_data(self): return self.data # get firstChild child of a node def getFirstChild(self): @@ -134,16 +134,16 @@ def __init__(self, data=None, next=None): self.last = None self.next = next # method for setting the data field of the node - def setData(self, data): + def set_data(self, data): self.data = data # method for getting the data field of the node - def getData(self): + def get_data(self): return self.data # method for setting the next field of the node - def setNext(self, next): + def set_next(self, next): self.next = next # method for getting the next field of the node - def getNext(self): + def get_next(self): return self.next # method for setting the last field of the node def setLast(self, last): @@ -152,7 +152,7 @@ def setLast(self, last): def getLast(self): return self.last # returns true if the node points to another node - def hasNext(self): + def has_next(self): return self.next != None @@ -175,19 +175,19 @@ def queueRear(self): if self.rear is None: print "Sorry, the queue is empty!" raise IndexError - return self.rear.getData() + return self.rear.get_data() def queueFront(self): if self.front is None: print "Sorry, the queue is empty!" raise IndexError - return self.front.getData() + return self.front.get_data() def deQueue(self): if self.rear is None: print "Sorry, the queue is empty!" raise IndexError - result = self.rear.getData() + result = self.rear.get_data() self.rear = self.rear.last self.size -= 1 return result @@ -208,7 +208,7 @@ def levelOrder(root, result): while not q.isEmpty(): n = q.deQueue() # dequeue FIFO - result.append(n.getData()) + result.append(n.get_data()) if n.firstChild is not None: q.enQueue(n.firstChild) @@ -224,13 +224,13 @@ def childrenCount(current): return count root = GenericTreeNode(11) -print(root.getData()) +print(root.get_data()) root.insertLeft(1) root.insertLeft(10) root.insertLeft(1100) root.insertRight(5) -root.getNextSibling().setData(2) +root.getNextSibling().set_data(2) result = [] levelOrder(root, result) print result diff --git a/src/chapter06trees/CountSiblingsGenericBinaryTree.py b/src/chapter06trees/CountSiblingsGenericBinaryTree.py index 8f7525a..c8798c2 100644 --- a/src/chapter06trees/CountSiblingsGenericBinaryTree.py +++ b/src/chapter06trees/CountSiblingsGenericBinaryTree.py @@ -15,10 +15,10 @@ def __init__(self, data): self.firstChild = None # left child self.nextSibling = None # right child # set data - def setData(self, data): + def set_data(self, data): self.data = data # get data - def getData(self): + def get_data(self): return self.data # get firstChild child of a node def getFirstChild(self): @@ -134,16 +134,16 @@ def __init__(self, data=None, next=None): self.last = None self.next = next # method for setting the data field of the node - def setData(self, data): + def set_data(self, data): self.data = data # method for getting the data field of the node - def getData(self): + def get_data(self): return self.data # method for setting the next field of the node - def setNext(self, next): + def set_next(self, next): self.next = next # method for getting the next field of the node - def getNext(self): + def get_next(self): return self.next # method for setting the last field of the node def setLast(self, last): @@ -152,7 +152,7 @@ def setLast(self, last): def getLast(self): return self.last # returns true if the node points to another node - def hasNext(self): + def has_next(self): return self.next != None @@ -175,19 +175,19 @@ def queueRear(self): if self.rear is None: print "Sorry, the queue is empty!" raise IndexError - return self.rear.getData() + return self.rear.get_data() def queueFront(self): if self.front is None: print "Sorry, the queue is empty!" raise IndexError - return self.front.getData() + return self.front.get_data() def deQueue(self): if self.rear is None: print "Sorry, the queue is empty!" raise IndexError - result = self.rear.getData() + result = self.rear.get_data() self.rear = self.rear.last self.size -= 1 return result @@ -208,7 +208,7 @@ def levelOrder(root, result): while not q.isEmpty(): n = q.deQueue() # dequeue FIFO - result.append(n.getData()) + result.append(n.get_data()) if n.firstChild is not None: q.enQueue(n.firstChild) @@ -224,13 +224,13 @@ def siblingsCount(current): return count root = GenericTreeNode(11) -print(root.getData()) +print(root.get_data()) root.insertLeft(1) root.insertLeft(10) root.insertLeft(1100) root.insertRight(5) -root.getNextSibling().setData(2) +root.getNextSibling().set_data(2) result = [] levelOrder(root, result) print result diff --git a/src/chapter06trees/DeepestNodeBT.py b/src/chapter06trees/DeepestNodeBT.py index c9e9179..7010cfe 100644 --- a/src/chapter06trees/DeepestNodeBT.py +++ b/src/chapter06trees/DeepestNodeBT.py @@ -16,16 +16,16 @@ def __init__(self, data=None, next=None): self.last = None self.next = next # method for setting the data field of the node - def setData(self, data): + def set_data(self, data): self.data = data # method for getting the data field of the node - def getData(self): + def get_data(self): return self.data # method for setting the next field of the node - def setNext(self, next): + def set_next(self, next): self.next = next # method for getting the next field of the node - def getNext(self): + def get_next(self): return self.next # method for setting the last field of the node def setLast(self, last): @@ -34,7 +34,7 @@ def setLast(self, last): def getLast(self): return self.last # returns true if the node points to another node - def hasNext(self): + def has_next(self): return self.next != None @@ -47,21 +47,21 @@ def __init__(self, data=None): def push(self, data): temp = Node() - temp.setData(data) - temp.setNext(self.head) + temp.set_data(data) + temp.set_next(self.head) self.head = temp def pop(self): if self.head is None: raise IndexError - temp = self.head.getData() - self.head = self.head.getNext() + temp = self.head.get_data() + self.head = self.head.get_next() return temp def peek(self): if self.head is None: raise IndexError - return self.head.getData() + return self.head.get_data() def isEmpty(self): return self.head == None @@ -85,19 +85,19 @@ def queueRear(self): if self.rear is None: print "Sorry, the queue is empty!" raise IndexError - return self.rear.getData() + return self.rear.get_data() def queueFront(self): if self.front is None: print "Sorry, the queue is empty!" raise IndexError - return self.front.getData() + return self.front.get_data() def deQueue(self): if self.rear is None: print "Sorry, the queue is empty!" raise IndexError - result = self.rear.getData() + result = self.rear.get_data() self.rear = self.rear.last self.size -= 1 return result @@ -116,10 +116,10 @@ def __init__(self, data): self.left = None # left child self.right = None # right child # set data - def setData(self, data): + def set_data(self, data): self.data = data # get data - def getData(self): + def get_data(self): return self.data # get left child of a node def getLeft(self): @@ -156,7 +156,7 @@ def insertInBinaryTreeUsingLevelOrder(root, data): while not q.isEmpty(): node = q.deQueue() # dequeue FIFO - if data == node.getData(): + if data == node.get_data(): return root if node.left is not None: q.enQueue(node.left) @@ -183,7 +183,7 @@ def deepestNode(root): if node.right is not None: q.enQueue(node.right) - return node.getData() + return node.get_data() # In-order recursive traversal. The nodes' values are appended to the result list in traversal order @@ -205,7 +205,7 @@ def deleteBinaryTree(root): root = BinaryTree(11) -print(root.getData()) +print(root.get_data()) root = insertInBinaryTreeUsingLevelOrder(root, 1) root = insertInBinaryTreeUsingLevelOrder(root, 2) root = insertInBinaryTreeUsingLevelOrder(root, 3) diff --git a/src/chapter06trees/DeletebinaryTree.py b/src/chapter06trees/DeletebinaryTree.py index c45b6db..78385b8 100644 --- a/src/chapter06trees/DeletebinaryTree.py +++ b/src/chapter06trees/DeletebinaryTree.py @@ -16,16 +16,16 @@ def __init__(self, data=None, next=None): self.last = None self.next = next # method for setting the data field of the node - def setData(self, data): + def set_data(self, data): self.data = data # method for getting the data field of the node - def getData(self): + def get_data(self): return self.data # method for setting the next field of the node - def setNext(self, next): + def set_next(self, next): self.next = next # method for getting the next field of the node - def getNext(self): + def get_next(self): return self.next # method for setting the last field of the node def setLast(self, last): @@ -34,7 +34,7 @@ def setLast(self, last): def getLast(self): return self.last # returns true if the node points to another node - def hasNext(self): + def has_next(self): return self.next != None @@ -47,21 +47,21 @@ def __init__(self, data=None): def push(self, data): temp = Node() - temp.setData(data) - temp.setNext(self.head) + temp.set_data(data) + temp.set_next(self.head) self.head = temp def pop(self): if self.head is None: raise IndexError - temp = self.head.getData() - self.head = self.head.getNext() + temp = self.head.get_data() + self.head = self.head.get_next() return temp def peek(self): if self.head is None: raise IndexError - return self.head.getData() + return self.head.get_data() def isEmpty(self): return self.head == None @@ -85,19 +85,19 @@ def queueRear(self): if self.rear is None: print "Sorry, the queue is empty!" raise IndexError - return self.rear.getData() + return self.rear.get_data() def queueFront(self): if self.front is None: print "Sorry, the queue is empty!" raise IndexError - return self.front.getData() + return self.front.get_data() def deQueue(self): if self.rear is None: print "Sorry, the queue is empty!" raise IndexError - result = self.rear.getData() + result = self.rear.get_data() self.rear = self.rear.last self.size -= 1 return result @@ -116,10 +116,10 @@ def __init__(self, data): self.left = None # left child self.right = None # right child # set data - def setData(self, data): + def set_data(self, data): self.data = data # get data - def getData(self): + def get_data(self): return self.data # get left child of a node def getLeft(self): @@ -156,7 +156,7 @@ def insertInBinaryTreeUsingLevelOrder(root, data): while not q.isEmpty(): node = q.deQueue() # dequeue FIFO - if data == node.getData(): + if data == node.get_data(): return root if node.left is not None: q.enQueue(node.left) @@ -188,7 +188,7 @@ def levelOrderTraversalInReverse(root): s.push(node) while(not s.isEmpty()): - print s.pop().getData() + print s.pop().get_data() # In-order recursive traversal. The nodes' values are appended to the result list in traversal order @@ -210,7 +210,7 @@ def deleteBinaryTree(root): root = BinaryTree(11) -print(root.getData()) +print(root.get_data()) root = insertInBinaryTreeUsingLevelOrder(root, 1) root = insertInBinaryTreeUsingLevelOrder(root, 2) root = insertInBinaryTreeUsingLevelOrder(root, 3) diff --git a/src/chapter06trees/FillNextSiblingsWithLevelOrderTraversal.py b/src/chapter06trees/FillNextSiblingsWithLevelOrderTraversal.py index 67e207d..8740f32 100644 --- a/src/chapter06trees/FillNextSiblingsWithLevelOrderTraversal.py +++ b/src/chapter06trees/FillNextSiblingsWithLevelOrderTraversal.py @@ -16,16 +16,16 @@ def __init__(self, data=None, next=None): self.last = None self.next = next # method for setting the data field of the node - def setData(self, data): + def set_data(self, data): self.data = data # method for getting the data field of the node - def getData(self): + def get_data(self): return self.data # method for setting the next field of the node - def setNext(self, next): + def set_next(self, next): self.next = next # method for getting the next field of the node - def getNext(self): + def get_next(self): return self.next # method for setting the last field of the node def setLast(self, last): @@ -34,7 +34,7 @@ def setLast(self, last): def getLast(self): return self.last # returns true if the node points to another node - def hasNext(self): + def has_next(self): return self.next != None @@ -47,21 +47,21 @@ def __init__(self, data=None): def push(self, data): temp = Node() - temp.setData(data) - temp.setNext(self.head) + temp.set_data(data) + temp.set_next(self.head) self.head = temp def pop(self): if self.head is None: raise IndexError - temp = self.head.getData() - self.head = self.head.getNext() + temp = self.head.get_data() + self.head = self.head.get_next() return temp def peek(self): if self.head is None: raise IndexError - return self.head.getData() + return self.head.get_data() def isEmpty(self): return self.head == None @@ -85,19 +85,19 @@ def queueRear(self): if self.rear is None: print "Sorry, the queue is empty!" raise IndexError - return self.rear.getData() + return self.rear.get_data() def queueFront(self): if self.front is None: print "Sorry, the queue is empty!" raise IndexError - return self.front.getData() + return self.front.get_data() def deQueue(self): if self.rear is None: print "Sorry, the queue is empty!" raise IndexError - result = self.rear.getData() + result = self.rear.get_data() self.rear = self.rear.last self.size -= 1 return result @@ -117,10 +117,10 @@ def __init__(self, data): self.right = None # right child self.nextSibling = None # set data - def setData(self, data): + def set_data(self, data): self.data = data # get data - def getData(self): + def get_data(self): return self.data # get left child of a node def getLeft(self): @@ -157,7 +157,7 @@ def insertInBinaryTreeUsingLevelOrder(root, data): while not q.isEmpty(): node = q.deQueue() # dequeue FIFO - if data == node.getData(): + if data == node.get_data(): return root if node.left is not None: q.enQueue(node.left) @@ -199,7 +199,7 @@ def inorderRecursive(root): root = BinaryTree(11) -print(root.getData()) +print(root.get_data()) root = insertInBinaryTreeUsingLevelOrder(root, 1) root = insertInBinaryTreeUsingLevelOrder(root, 2) root = insertInBinaryTreeUsingLevelOrder(root, 3) diff --git a/src/chapter06trees/FindInBinaryTreeRecursive.py b/src/chapter06trees/FindInBinaryTreeRecursive.py index becb166..7f5beb6 100644 --- a/src/chapter06trees/FindInBinaryTreeRecursive.py +++ b/src/chapter06trees/FindInBinaryTreeRecursive.py @@ -16,16 +16,16 @@ def __init__(self, data=None, next=None): self.last = None self.next = next # method for setting the data field of the node - def setData(self, data): + def set_data(self, data): self.data = data # method for getting the data field of the node - def getData(self): + def get_data(self): return self.data # method for setting the next field of the node - def setNext(self, next): + def set_next(self, next): self.next = next # method for getting the next field of the node - def getNext(self): + def get_next(self): return self.next # method for setting the last field of the node def setLast(self, last): @@ -34,7 +34,7 @@ def setLast(self, last): def getLast(self): return self.last # returns true if the node points to another node - def hasNext(self): + def has_next(self): return self.next != None @@ -57,19 +57,19 @@ def queueRear(self): if self.rear is None: print "Sorry, the queue is empty!" raise IndexError - return self.rear.getData() + return self.rear.get_data() def queueFront(self): if self.front is None: print "Sorry, the queue is empty!" raise IndexError - return self.front.getData() + return self.front.get_data() def deQueue(self): if self.rear is None: print "Sorry, the queue is empty!" raise IndexError - result = self.rear.getData() + result = self.rear.get_data() self.rear = self.rear.last self.size -= 1 return result @@ -88,10 +88,10 @@ def __init__(self, data): self.left = None # left child self.right = None # right child # set data - def setData(self, data): + def set_data(self, data): self.data = data # get data - def getData(self): + def get_data(self): return self.data # get left child of a node def getLeft(self): @@ -127,8 +127,8 @@ def findMaxUsingLevelOrder(root): while not q.isEmpty(): node = q.deQueue() # dequeue FIFO - if maxElement < node.getData(): - maxElement = node.getData() + if maxElement < node.get_data(): + maxElement = node.get_data() if node.left is not None: q.enQueue(node.left) @@ -141,7 +141,7 @@ def findRecursive(root, data): if not root: return 0 - if root.getData() == data: + if root.get_data() == data: return 1 else: temp = findRecursive(root.left, data) @@ -152,16 +152,16 @@ def findRecursive(root, data): root = BinaryTree(11) -print(root.getData()) +print(root.get_data()) root.insertLeft(1) root.insertLeft(10) root.insertLeft(100) -print(root.getLeft().getData()) +print(root.getLeft().get_data()) root.insertRight(5) -print(root.getRight().getData()) +print(root.getRight().get_data()) root.insertRight(25) -root.getRight().setData(25) -print(root.getRight().getData()) +root.getRight().set_data(25) +print(root.getRight().get_data()) print findRecursive(root, 25) diff --git a/src/chapter06trees/FindInBinaryTreeUsingLevelOrder.py b/src/chapter06trees/FindInBinaryTreeUsingLevelOrder.py index 77d133d..a009341 100644 --- a/src/chapter06trees/FindInBinaryTreeUsingLevelOrder.py +++ b/src/chapter06trees/FindInBinaryTreeUsingLevelOrder.py @@ -16,16 +16,16 @@ def __init__(self, data=None, next=None): self.last = None self.next = next # method for setting the data field of the node - def setData(self, data): + def set_data(self, data): self.data = data # method for getting the data field of the node - def getData(self): + def get_data(self): return self.data # method for setting the next field of the node - def setNext(self, next): + def set_next(self, next): self.next = next # method for getting the next field of the node - def getNext(self): + def get_next(self): return self.next # method for setting the last field of the node def setLast(self, last): @@ -34,7 +34,7 @@ def setLast(self, last): def getLast(self): return self.last # returns true if the node points to another node - def hasNext(self): + def has_next(self): return self.next != None @@ -57,19 +57,19 @@ def queueRear(self): if self.rear is None: print "Sorry, the queue is empty!" raise IndexError - return self.rear.getData() + return self.rear.get_data() def queueFront(self): if self.front is None: print "Sorry, the queue is empty!" raise IndexError - return self.front.getData() + return self.front.get_data() def deQueue(self): if self.rear is None: print "Sorry, the queue is empty!" raise IndexError - result = self.rear.getData() + result = self.rear.get_data() self.rear = self.rear.last self.size -= 1 return result @@ -88,10 +88,10 @@ def __init__(self, data): self.left = None # left child self.right = None # right child # set data - def setData(self, data): + def set_data(self, data): self.data = data # get data - def getData(self): + def get_data(self): return self.data # get left child of a node def getLeft(self): @@ -126,7 +126,7 @@ def findUsingLevelOrder(root, data): while not q.isEmpty(): node = q.deQueue() # dequeue FIFO - if data == node.getData(): + if data == node.get_data(): return 1 if node.left is not None: q.enQueue(node.left) @@ -139,7 +139,7 @@ def findRecursive(root, data): if not root: return 0 - if root.getData() == data: + if root.get_data() == data: return 1 else: temp = findRecursive(root.left, data) @@ -150,16 +150,16 @@ def findRecursive(root, data): root = BinaryTree(11) -print(root.getData()) +print(root.get_data()) root.insertLeft(1) root.insertLeft(10) root.insertLeft(100) -print(root.getLeft().getData()) +print(root.getLeft().get_data()) root.insertRight(5) -print(root.getRight().getData()) +print(root.getRight().get_data()) root.insertRight(25) -root.getRight().setData(25) -print(root.getRight().getData()) +root.getRight().set_data(25) +print(root.getRight().get_data()) print findUsingLevelOrder(root, 25) diff --git a/src/chapter06trees/FindLevelwithMaxSum.py b/src/chapter06trees/FindLevelwithMaxSum.py index 4c27983..84e7e9a 100644 --- a/src/chapter06trees/FindLevelwithMaxSum.py +++ b/src/chapter06trees/FindLevelwithMaxSum.py @@ -16,16 +16,16 @@ def __init__(self, data=None, next=None): self.last = None self.next = next # method for setting the data field of the node - def setData(self, data): + def set_data(self, data): self.data = data # method for getting the data field of the node - def getData(self): + def get_data(self): return self.data # method for setting the next field of the node - def setNext(self, next): + def set_next(self, next): self.next = next # method for getting the next field of the node - def getNext(self): + def get_next(self): return self.next # method for setting the last field of the node def setLast(self, last): @@ -34,7 +34,7 @@ def setLast(self, last): def getLast(self): return self.last # returns true if the node points to another node - def hasNext(self): + def has_next(self): return self.next != None @@ -47,21 +47,21 @@ def __init__(self, data=None): def push(self, data): temp = Node() - temp.setData(data) - temp.setNext(self.head) + temp.set_data(data) + temp.set_next(self.head) self.head = temp def pop(self): if self.head is None: raise IndexError - temp = self.head.getData() - self.head = self.head.getNext() + temp = self.head.get_data() + self.head = self.head.get_next() return temp def peek(self): if self.head is None: raise IndexError - return self.head.getData() + return self.head.get_data() def isEmpty(self): return self.head == None @@ -85,19 +85,19 @@ def queueRear(self): if self.rear is None: print "Sorry, the queue is empty!" raise IndexError - return self.rear.getData() + return self.rear.get_data() def queueFront(self): if self.front is None: print "Sorry, the queue is empty!" raise IndexError - return self.front.getData() + return self.front.get_data() def deQueue(self): if self.rear is None: print "Sorry, the queue is empty!" raise IndexError - result = self.rear.getData() + result = self.rear.get_data() self.rear = self.rear.last self.size -= 1 return result @@ -116,10 +116,10 @@ def __init__(self, data): self.left = None # left child self.right = None # right child # set data - def setData(self, data): + def set_data(self, data): self.data = data # get data - def getData(self): + def get_data(self): return self.data # get left child of a node def getLeft(self): @@ -156,7 +156,7 @@ def insertInBinaryTreeUsingLevelOrder(root, data): while not q.isEmpty(): node = q.deQueue() # dequeue FIFO - if data == node.getData(): + if data == node.get_data(): return root if node.left is not None: q.enQueue(node.left) @@ -191,7 +191,7 @@ def findLevelwithMaxSum(root): q.enQueue(None) level += 1 else: - currentSum += node.getData() + currentSum += node.get_data() if node.left is not None: q.enQueue(node.left) diff --git a/src/chapter06trees/FindMaxBSTIterative.py b/src/chapter06trees/FindMaxBSTIterative.py index 996733a..df13854 100644 --- a/src/chapter06trees/FindMaxBSTIterative.py +++ b/src/chapter06trees/FindMaxBSTIterative.py @@ -20,10 +20,10 @@ def __init__(self, data): self.parent = None # set data - def setData(self, data): + def set_data(self, data): self.data = data # get data - def getData(self): + def get_data(self): return self.data # get left child of a node def getLeft(self): @@ -207,7 +207,7 @@ def findMaxIterative(root): return None while currentNode.getRight() != None: currentNode = currentNode.getRight() - return currentNode.getData() + return currentNode.get_data() root = BSTNode(11) diff --git a/src/chapter06trees/FindMaxInBSTRecursive.py b/src/chapter06trees/FindMaxInBSTRecursive.py index ab8ced4..821dacb 100644 --- a/src/chapter06trees/FindMaxInBSTRecursive.py +++ b/src/chapter06trees/FindMaxInBSTRecursive.py @@ -20,10 +20,10 @@ def __init__(self, data): self.parent = None # set data - def setData(self, data): + def set_data(self, data): self.data = data # get data - def getData(self): + def get_data(self): return self.data # get left child of a node def getLeft(self): @@ -207,13 +207,13 @@ def findMaxIterative(root): return None while currentNode.getRight() != None: currentNode = currentNode.getRight() - return currentNode.getData() + return currentNode.get_data() # Search the key from node, iteratively def findMaxRecursive(root): currentNode = root if currentNode.getRight() == None: - return currentNode.getData() + return currentNode.get_data() else: return findMaxRecursive(currentNode.getRight()) diff --git a/src/chapter06trees/FindMaxRecursiveInBinraryTree.py b/src/chapter06trees/FindMaxRecursiveInBinraryTree.py index 99e4b57..a466edc 100644 --- a/src/chapter06trees/FindMaxRecursiveInBinraryTree.py +++ b/src/chapter06trees/FindMaxRecursiveInBinraryTree.py @@ -16,16 +16,16 @@ def __init__(self, data=None, next=None): self.last = None self.next = next # method for setting the data field of the node - def setData(self, data): + def set_data(self, data): self.data = data # method for getting the data field of the node - def getData(self): + def get_data(self): return self.data # method for setting the next field of the node - def setNext(self, next): + def set_next(self, next): self.next = next # method for getting the next field of the node - def getNext(self): + def get_next(self): return self.next # method for setting the last field of the node def setLast(self, last): @@ -34,7 +34,7 @@ def setLast(self, last): def getLast(self): return self.last # returns true if the node points to another node - def hasNext(self): + def has_next(self): return self.next != None @@ -57,19 +57,19 @@ def queueRear(self): if self.rear is None: print "Sorry, the queue is empty!" raise IndexError - return self.rear.getData() + return self.rear.get_data() def queueFront(self): if self.front is None: print "Sorry, the queue is empty!" raise IndexError - return self.front.getData() + return self.front.get_data() def deQueue(self): if self.rear is None: print "Sorry, the queue is empty!" raise IndexError - result = self.rear.getData() + result = self.rear.get_data() self.rear = self.rear.last self.size -= 1 return result @@ -88,10 +88,10 @@ def __init__(self, data): self.left = None # left child self.right = None # right child # set data - def setData(self, data): + def set_data(self, data): self.data = data # get data - def getData(self): + def get_data(self): return self.data # get left child of a node def getLeft(self): @@ -127,8 +127,8 @@ def findMaxUsingLevelOrder(root): while not q.isEmpty(): node = q.deQueue() # dequeue FIFO - if maxElement < node.getData(): - maxElement = node.getData() + if maxElement < node.get_data(): + maxElement = node.get_data() if node.left is not None: q.enQueue(node.left) @@ -143,8 +143,8 @@ def findMaxRecursive(root): # maxData is the initially the value of root if not root: return maxData - if root.getData() > maxData: - maxData = root.getData() + if root.get_data() > maxData: + maxData = root.get_data() findMaxRecursive(root.getLeft()) findMaxRecursive(root.getRight()) @@ -153,16 +153,16 @@ def findMaxRecursive(root): # maxData is the initially the value of root root = BinaryTree(11) -print(root.getData()) +print(root.get_data()) root.insertLeft(1) root.insertLeft(10) root.insertLeft(100) -print(root.getLeft().getData()) +print(root.getLeft().get_data()) root.insertRight(5) -print(root.getRight().getData()) -root.getRight().setData(2) -print(root.getRight().getData()) +print(root.getRight().get_data()) +root.getRight().set_data(2) +print(root.getRight().get_data()) print findMaxRecursive(root) diff --git a/src/chapter06trees/FindMaxUsingLevelOrder.py b/src/chapter06trees/FindMaxUsingLevelOrder.py index f2fec4a..bab248d 100644 --- a/src/chapter06trees/FindMaxUsingLevelOrder.py +++ b/src/chapter06trees/FindMaxUsingLevelOrder.py @@ -16,16 +16,16 @@ def __init__(self, data=None, next=None): self.last = None self.next = next # method for setting the data field of the node - def setData(self, data): + def set_data(self, data): self.data = data # method for getting the data field of the node - def getData(self): + def get_data(self): return self.data # method for setting the next field of the node - def setNext(self, next): + def set_next(self, next): self.next = next # method for getting the next field of the node - def getNext(self): + def get_next(self): return self.next # method for setting the last field of the node def setLast(self, last): @@ -34,7 +34,7 @@ def setLast(self, last): def getLast(self): return self.last # returns true if the node points to another node - def hasNext(self): + def has_next(self): return self.next != None @@ -57,19 +57,19 @@ def queueRear(self): if self.rear is None: print "Sorry, the queue is empty!" raise IndexError - return self.rear.getData() + return self.rear.get_data() def queueFront(self): if self.front is None: print "Sorry, the queue is empty!" raise IndexError - return self.front.getData() + return self.front.get_data() def deQueue(self): if self.rear is None: print "Sorry, the queue is empty!" raise IndexError - result = self.rear.getData() + result = self.rear.get_data() self.rear = self.rear.last self.size -= 1 return result @@ -88,10 +88,10 @@ def __init__(self, data): self.left = None # left child self.right = None # right child # set data - def setData(self, data): + def set_data(self, data): self.data = data # get data - def getData(self): + def get_data(self): return self.data # get left child of a node def getLeft(self): @@ -127,8 +127,8 @@ def findMaxUsingLevelOrder(root): while not q.isEmpty(): node = q.deQueue() # dequeue FIFO - if maxElement < node.getData(): - maxElement = node.getData() + if maxElement < node.get_data(): + maxElement = node.get_data() if node.left is not None: q.enQueue(node.left) @@ -138,15 +138,15 @@ def findMaxUsingLevelOrder(root): print maxElement root = BinaryTree(11) -print(root.getData()) +print(root.get_data()) root.insertLeft(1) root.insertLeft(10) root.insertLeft(100) -print(root.getLeft().getData()) +print(root.getLeft().get_data()) root.insertRight(5) -print(root.getRight().getData()) -root.getRight().setData(2) -print(root.getRight().getData()) +print(root.getRight().get_data()) +root.getRight().set_data(2) +print(root.getRight().get_data()) findMaxUsingLevelOrder(root) diff --git a/src/chapter06trees/FindMinBSTIterative.py b/src/chapter06trees/FindMinBSTIterative.py index 105d517..0280099 100644 --- a/src/chapter06trees/FindMinBSTIterative.py +++ b/src/chapter06trees/FindMinBSTIterative.py @@ -20,10 +20,10 @@ def __init__(self, data): self.parent = None # set data - def setData(self, data): + def set_data(self, data): self.data = data # get data - def getData(self): + def get_data(self): return self.data # get left child of a node def getLeft(self): @@ -205,7 +205,7 @@ def findMinIterative(root): return None while currentNode.getLeft() != None: currentNode = currentNode.getLeft() - return currentNode.getData() + return currentNode.get_data() root = BSTNode(11) diff --git a/src/chapter06trees/FindMinBSTRecursive.py b/src/chapter06trees/FindMinBSTRecursive.py index 22b08e9..83dcaf0 100644 --- a/src/chapter06trees/FindMinBSTRecursive.py +++ b/src/chapter06trees/FindMinBSTRecursive.py @@ -20,10 +20,10 @@ def __init__(self, data): self.parent = None # set data - def setData(self, data): + def set_data(self, data): self.data = data # get data - def getData(self): + def get_data(self): return self.data # get left child of a node def getLeft(self): @@ -202,7 +202,7 @@ def inorderRecursive(root): def findMinRecursive(root): currentNode = root if currentNode.getLeft() == None: - return currentNode.getData() + return currentNode.get_data() else: return findMinRecursive(currentNode.getLeft()) diff --git a/src/chapter06trees/FindSizeusingLevelOrder.py b/src/chapter06trees/FindSizeusingLevelOrder.py index 5768a13..158c94c 100644 --- a/src/chapter06trees/FindSizeusingLevelOrder.py +++ b/src/chapter06trees/FindSizeusingLevelOrder.py @@ -16,16 +16,16 @@ def __init__(self, data=None, next=None): self.last = None self.next = next # method for setting the data field of the node - def setData(self, data): + def set_data(self, data): self.data = data # method for getting the data field of the node - def getData(self): + def get_data(self): return self.data # method for setting the next field of the node - def setNext(self, next): + def set_next(self, next): self.next = next # method for getting the next field of the node - def getNext(self): + def get_next(self): return self.next # method for setting the last field of the node def setLast(self, last): @@ -34,7 +34,7 @@ def setLast(self, last): def getLast(self): return self.last # returns true if the node points to another node - def hasNext(self): + def has_next(self): return self.next != None @@ -57,19 +57,19 @@ def queueRear(self): if self.rear is None: print "Sorry, the queue is empty!" raise IndexError - return self.rear.getData() + return self.rear.get_data() def queueFront(self): if self.front is None: print "Sorry, the queue is empty!" raise IndexError - return self.front.getData() + return self.front.get_data() def deQueue(self): if self.rear is None: print "Sorry, the queue is empty!" raise IndexError - result = self.rear.getData() + result = self.rear.get_data() self.rear = self.rear.last self.size -= 1 return result @@ -88,10 +88,10 @@ def __init__(self, data): self.left = None # left child self.right = None # right child # set data - def setData(self, data): + def set_data(self, data): self.data = data # get data - def getData(self): + def get_data(self): return self.data # get left child of a node def getLeft(self): @@ -128,7 +128,7 @@ def insertInBinaryTreeUsingLevelOrder(root, data): while not q.isEmpty(): node = q.deQueue() # dequeue FIFO - if data == node.getData(): + if data == node.get_data(): return root if node.left is not None: q.enQueue(node.left) @@ -171,7 +171,7 @@ def inorderRecursive(root): root = BinaryTree(11) -print(root.getData()) +print(root.get_data()) root = insertInBinaryTreeUsingLevelOrder(root, 1) root = insertInBinaryTreeUsingLevelOrder(root, 2) root = insertInBinaryTreeUsingLevelOrder(root, 3) diff --git a/src/chapter06trees/FullK-AryTrees.py b/src/chapter06trees/FullK-AryTrees.py index e2b95eb..f828491 100644 --- a/src/chapter06trees/FullK-AryTrees.py +++ b/src/chapter06trees/FullK-AryTrees.py @@ -16,16 +16,16 @@ def __init__(self, data=None, next=None): self.last = None self.next = next # method for setting the data field of the node - def setData(self, data): + def set_data(self, data): self.data = data # method for getting the data field of the node - def getData(self): + def get_data(self): return self.data # method for setting the next field of the node - def setNext(self, next): + def set_next(self, next): self.next = next # method for getting the next field of the node - def getNext(self): + def get_next(self): return self.next # method for setting the last field of the node def setLast(self, last): @@ -34,7 +34,7 @@ def setLast(self, last): def getLast(self): return self.last # returns true if the node points to another node - def hasNext(self): + def has_next(self): return self.next != None class Queue(object): @@ -56,19 +56,19 @@ def queueRear(self): if self.rear is None: print "Sorry, the queue is empty!" raise IndexError - return self.rear.getData() + return self.rear.get_data() def queueFront(self): if self.front is None: print "Sorry, the queue is empty!" raise IndexError - return self.front.getData() + return self.front.get_data() def deQueue(self): if self.rear is None: print "Sorry, the queue is empty!" raise IndexError - result = self.rear.getData() + result = self.rear.get_data() self.rear = self.rear.last self.size -= 1 return result @@ -86,10 +86,10 @@ def __init__(self, data): self.left = None # left child self.right = None # right child # set data - def setData(self, data): + def set_data(self, data): self.data = data # get data - def getData(self): + def get_data(self): return self.data # get left child of a node def getLeft(self): diff --git a/src/chapter06trees/InsertInBinaryTree.py b/src/chapter06trees/InsertInBinaryTree.py index 10bba5a..f506872 100644 --- a/src/chapter06trees/InsertInBinaryTree.py +++ b/src/chapter06trees/InsertInBinaryTree.py @@ -16,16 +16,16 @@ def __init__(self, data=None, next=None): self.last = None self.next = next # method for setting the data field of the node - def setData(self, data): + def set_data(self, data): self.data = data # method for getting the data field of the node - def getData(self): + def get_data(self): return self.data # method for setting the next field of the node - def setNext(self, next): + def set_next(self, next): self.next = next # method for getting the next field of the node - def getNext(self): + def get_next(self): return self.next # method for setting the last field of the node def setLast(self, last): @@ -34,7 +34,7 @@ def setLast(self, last): def getLast(self): return self.last # returns true if the node points to another node - def hasNext(self): + def has_next(self): return self.next != None @@ -57,19 +57,19 @@ def queueRear(self): if self.rear is None: print "Sorry, the queue is empty!" raise IndexError - return self.rear.getData() + return self.rear.get_data() def queueFront(self): if self.front is None: print "Sorry, the queue is empty!" raise IndexError - return self.front.getData() + return self.front.get_data() def deQueue(self): if self.rear is None: print "Sorry, the queue is empty!" raise IndexError - result = self.rear.getData() + result = self.rear.get_data() self.rear = self.rear.last self.size -= 1 return result @@ -88,10 +88,10 @@ def __init__(self, data): self.left = None # left child self.right = None # right child # set data - def setData(self, data): + def set_data(self, data): self.data = data # get data - def getData(self): + def get_data(self): return self.data # get left child of a node def getLeft(self): @@ -128,7 +128,7 @@ def insertInBinaryTreeUsingLevelOrder(root, data): while not q.isEmpty(): node = q.deQueue() # dequeue FIFO - if data == node.getData(): + if data == node.get_data(): return root if node.left is not None: q.enQueue(node.left) @@ -145,7 +145,7 @@ def findRecursive(root, data): if not root: return 0 - if root.getData() == data: + if root.get_data() == data: return 1 else: temp = findRecursive(root.left, data) @@ -165,7 +165,7 @@ def inorderRecursive(root): root = BinaryTree(11) -print(root.getData()) +print(root.get_data()) root = insertInBinaryTreeUsingLevelOrder(root, 1) root = insertInBinaryTreeUsingLevelOrder(root, 2) root = insertInBinaryTreeUsingLevelOrder(root, 3) diff --git a/src/chapter06trees/IsBST.py b/src/chapter06trees/IsBST.py index b14e5b9..dfa0f3d 100644 --- a/src/chapter06trees/IsBST.py +++ b/src/chapter06trees/IsBST.py @@ -15,10 +15,10 @@ def __init__(self, data): self.left = None # left child self.right = None # right child # set data - def setData(self, data): + def set_data(self, data): self.data = data # get data - def getData(self): + def get_data(self): return self.data # get left child of a node def getLeft(self): @@ -31,11 +31,11 @@ def IsBST(root): if root == None: return 1 # false if left is > than root - if root.getLeft() != None and root.getLeft().getData() > root.getData(): + if root.getLeft() != None and root.getLeft().get_data() > root.get_data(): return 0 # false if right is < than root - if root.getRight() != None and root.getRight().getData() < root.getData(): + if root.getRight() != None and root.getRight().get_data() < root.get_data(): return 0 # false if, recursively, the left or right is not a BST @@ -48,10 +48,10 @@ def IsBST(root): def IsBST2(root, min, max): if root == None: return 1 - if root.getData() <= min or root.getData() >= max: + if root.get_data() <= min or root.get_data() >= max: return 0 - result = IsBST2(root.getLeft(), min, root.getData()) - result = result and IsBST2(root.getRight(), root.getData(), max) + result = IsBST2(root.getLeft(), min, root.get_data()) + result = result and IsBST2(root.getRight(), root.get_data(), max) return result # Returns true if a binary tree is a binary search tree @@ -60,11 +60,11 @@ def IsBST3(root): return 1 # false if the max of the left is > than root - if(root.getLeft() != None and FindMax(root.getLeft()) > root.getData()) + if(root.getLeft() != None and FindMax(root.getLeft()) > root.get_data()) return 0 # false if the min of the right is <= than root - if(root.getRight() != None and FindMin(root.getRight()) < root.getData()) + if(root.getRight() != None and FindMin(root.getRight()) < root.get_data()) return 0 # false if, recursively, the left or right is not a BST @@ -79,7 +79,7 @@ def isBST4(root, previousValue=[NEG_INFINITY]): return 1 if not isBST4(root.getLeft(), previousValue): return False - if root.getData() < lastNode[0]: + if root.get_data() < lastNode[0]: return 0 - previousValue = root.getData() + previousValue = root.get_data() return isBST4(root.getRight(), previousValue) diff --git a/src/chapter06trees/IsomorphicTreesCheck.py b/src/chapter06trees/IsomorphicTreesCheck.py index ce58fa0..1cfa78e 100644 --- a/src/chapter06trees/IsomorphicTreesCheck.py +++ b/src/chapter06trees/IsomorphicTreesCheck.py @@ -15,10 +15,10 @@ def __init__(self, data): self.left = None # left child self.right = None # right child # set data - def setData(self, data): + def set_data(self, data): self.data = data # get data - def getData(self): + def get_data(self): return self.data # get left child of a node def getLeft(self): @@ -139,7 +139,7 @@ def isIsomorphic(root1, root2): root1.insertLeft(10) root1.insertLeft(1100) root1.insertRight(5) -root1.getRight().setData(2) +root1.getRight().set_data(2) postorderIterative(root1) root2 = BinaryTree(99) @@ -147,6 +147,6 @@ def isIsomorphic(root1, root2): root2.insertLeft(910) root2.insertLeft(9900) root2.insertRight(8) -root2.getRight().setData(2) +root2.getRight().set_data(2) postorderIterative(root2) print "Isomorphic:", isIsomorphic(root1, root2) diff --git a/src/chapter06trees/KthSmallestBST.py b/src/chapter06trees/KthSmallestBST.py index e6437fd..89ccc1b 100644 --- a/src/chapter06trees/KthSmallestBST.py +++ b/src/chapter06trees/KthSmallestBST.py @@ -90,7 +90,7 @@ def preOrderTraversal(root): def kthSmallestInBST(root, k): global count if(not root): - return None; + return None left = kthSmallestInBST(root.left, k) if(left): return left diff --git a/src/chapter06trees/LevelOrderTraversalInReverse.py b/src/chapter06trees/LevelOrderTraversalInReverse.py index d865f11..35edf3e 100644 --- a/src/chapter06trees/LevelOrderTraversalInReverse.py +++ b/src/chapter06trees/LevelOrderTraversalInReverse.py @@ -16,16 +16,16 @@ def __init__(self, data=None, next=None): self.last = None self.next = next # method for setting the data field of the node - def setData(self, data): + def set_data(self, data): self.data = data # method for getting the data field of the node - def getData(self): + def get_data(self): return self.data # method for setting the next field of the node - def setNext(self, next): + def set_next(self, next): self.next = next # method for getting the next field of the node - def getNext(self): + def get_next(self): return self.next # method for setting the last field of the node def setLast(self, last): @@ -34,7 +34,7 @@ def setLast(self, last): def getLast(self): return self.last # returns true if the node points to another node - def hasNext(self): + def has_next(self): return self.next != None @@ -47,21 +47,21 @@ def __init__(self, data=None): def push(self, data): temp = Node() - temp.setData(data) - temp.setNext(self.head) + temp.set_data(data) + temp.set_next(self.head) self.head = temp def pop(self): if self.head is None: raise IndexError - temp = self.head.getData() - self.head = self.head.getNext() + temp = self.head.get_data() + self.head = self.head.get_next() return temp def peek(self): if self.head is None: raise IndexError - return self.head.getData() + return self.head.get_data() def isEmpty(self): return self.head == None @@ -85,19 +85,19 @@ def queueRear(self): if self.rear is None: print "Sorry, the queue is empty!" raise IndexError - return self.rear.getData() + return self.rear.get_data() def queueFront(self): if self.front is None: print "Sorry, the queue is empty!" raise IndexError - return self.front.getData() + return self.front.get_data() def deQueue(self): if self.rear is None: print "Sorry, the queue is empty!" raise IndexError - result = self.rear.getData() + result = self.rear.get_data() self.rear = self.rear.last self.size -= 1 return result @@ -116,10 +116,10 @@ def __init__(self, data): self.left = None # left child self.right = None # right child # set data - def setData(self, data): + def set_data(self, data): self.data = data # get data - def getData(self): + def get_data(self): return self.data # get left child of a node def getLeft(self): @@ -156,7 +156,7 @@ def insertInBinaryTreeUsingLevelOrder(root, data): while not q.isEmpty(): node = q.deQueue() # dequeue FIFO - if data == node.getData(): + if data == node.get_data(): return root if node.left is not None: q.enQueue(node.left) @@ -188,7 +188,7 @@ def levelOrderTraversalInReverse(root): s.push(node) while(not s.isEmpty()): - print s.pop().getData() + print s.pop().get_data() # In-order recursive traversal. The nodes' values are appended to the result list in traversal order @@ -202,7 +202,7 @@ def inorderRecursive(root): root = BinaryTree(11) -print(root.getData()) +print(root.get_data()) root = insertInBinaryTreeUsingLevelOrder(root, 1) root = insertInBinaryTreeUsingLevelOrder(root, 2) root = insertInBinaryTreeUsingLevelOrder(root, 3) diff --git a/src/chapter06trees/LinkingNodesOfSameLevelBSTRecursive.py b/src/chapter06trees/LinkingNodesOfSameLevelBSTRecursive.py index 8fc7c69..3584ad6 100644 --- a/src/chapter06trees/LinkingNodesOfSameLevelBSTRecursive.py +++ b/src/chapter06trees/LinkingNodesOfSameLevelBSTRecursive.py @@ -16,16 +16,16 @@ def __init__(self, data=None, next=None): self.last = None self.next = next # method for setting the data field of the node - def setData(self, data): + def set_data(self, data): self.data = data # method for getting the data field of the node - def getData(self): + def get_data(self): return self.data # method for setting the next field of the node - def setNext(self, next): + def set_next(self, next): self.next = next # method for getting the next field of the node - def getNext(self): + def get_next(self): return self.next # method for setting the last field of the node def setLast(self, last): @@ -34,7 +34,7 @@ def setLast(self, last): def getLast(self): return self.last # returns true if the node points to another node - def hasNext(self): + def has_next(self): return self.next != None class Queue(object): @@ -56,19 +56,19 @@ def queueRear(self): if self.rear is None: print "Sorry, the queue is empty!" raise IndexError - return self.rear.getData() + return self.rear.get_data() def queueFront(self): if self.front is None: print "Sorry, the queue is empty!" raise IndexError - return self.front.getData() + return self.front.get_data() def deQueue(self): if self.rear is None: print "Sorry, the queue is empty!" raise IndexError - result = self.rear.getData() + result = self.rear.get_data() self.rear = self.rear.last self.size -= 1 return result diff --git a/src/chapter06trees/LinkingNodesOfSameLevelBSTWithLevelOrder.py b/src/chapter06trees/LinkingNodesOfSameLevelBSTWithLevelOrder.py index 8d4fdd1..2540d66 100644 --- a/src/chapter06trees/LinkingNodesOfSameLevelBSTWithLevelOrder.py +++ b/src/chapter06trees/LinkingNodesOfSameLevelBSTWithLevelOrder.py @@ -16,16 +16,16 @@ def __init__(self, data=None, next=None): self.last = None self.next = next # method for setting the data field of the node - def setData(self, data): + def set_data(self, data): self.data = data # method for getting the data field of the node - def getData(self): + def get_data(self): return self.data # method for setting the next field of the node - def setNext(self, next): + def set_next(self, next): self.next = next # method for getting the next field of the node - def getNext(self): + def get_next(self): return self.next # method for setting the last field of the node def setLast(self, last): @@ -34,7 +34,7 @@ def setLast(self, last): def getLast(self): return self.last # returns true if the node points to another node - def hasNext(self): + def has_next(self): return self.next != None class Queue(object): @@ -56,19 +56,19 @@ def queueRear(self): if self.rear is None: print "Sorry, the queue is empty!" raise IndexError - return self.rear.getData() + return self.rear.get_data() def queueFront(self): if self.front is None: print "Sorry, the queue is empty!" raise IndexError - return self.front.getData() + return self.front.get_data() def deQueue(self): if self.rear is None: print "Sorry, the queue is empty!" raise IndexError - result = self.rear.getData() + result = self.rear.get_data() self.rear = self.rear.last self.size -= 1 return result diff --git a/src/chapter06trees/NumberOfFullNodesInBTusingLevelOrder.py b/src/chapter06trees/NumberOfFullNodesInBTusingLevelOrder.py index d0c3d6d..e1eaac3 100644 --- a/src/chapter06trees/NumberOfFullNodesInBTusingLevelOrder.py +++ b/src/chapter06trees/NumberOfFullNodesInBTusingLevelOrder.py @@ -16,16 +16,16 @@ def __init__(self, data=None, next=None): self.last = None self.next = next # method for setting the data field of the node - def setData(self, data): + def set_data(self, data): self.data = data # method for getting the data field of the node - def getData(self): + def get_data(self): return self.data # method for setting the next field of the node - def setNext(self, next): + def set_next(self, next): self.next = next # method for getting the next field of the node - def getNext(self): + def get_next(self): return self.next # method for setting the last field of the node def setLast(self, last): @@ -34,7 +34,7 @@ def setLast(self, last): def getLast(self): return self.last # returns true if the node points to another node - def hasNext(self): + def has_next(self): return self.next != None @@ -47,21 +47,21 @@ def __init__(self, data=None): def push(self, data): temp = Node() - temp.setData(data) - temp.setNext(self.head) + temp.set_data(data) + temp.set_next(self.head) self.head = temp def pop(self): if self.head is None: raise IndexError - temp = self.head.getData() - self.head = self.head.getNext() + temp = self.head.get_data() + self.head = self.head.get_next() return temp def peek(self): if self.head is None: raise IndexError - return self.head.getData() + return self.head.get_data() def isEmpty(self): return self.head == None @@ -85,19 +85,19 @@ def queueRear(self): if self.rear is None: print "Sorry, the queue is empty!" raise IndexError - return self.rear.getData() + return self.rear.get_data() def queueFront(self): if self.front is None: print "Sorry, the queue is empty!" raise IndexError - return self.front.getData() + return self.front.get_data() def deQueue(self): if self.rear is None: print "Sorry, the queue is empty!" raise IndexError - result = self.rear.getData() + result = self.rear.get_data() self.rear = self.rear.last self.size -= 1 return result @@ -116,10 +116,10 @@ def __init__(self, data): self.left = None # left child self.right = None # right child # set data - def setData(self, data): + def set_data(self, data): self.data = data # get data - def getData(self): + def get_data(self): return self.data # get left child of a node def getLeft(self): @@ -156,7 +156,7 @@ def insertInBinaryTreeUsingLevelOrder(root, data): while not q.isEmpty(): node = q.deQueue() # dequeue FIFO - if data == node.getData(): + if data == node.get_data(): return root if node.left is not None: q.enQueue(node.left) @@ -207,7 +207,7 @@ def deleteBinaryTree(root): root = BinaryTree(11) -print(root.getData()) +print(root.get_data()) root = insertInBinaryTreeUsingLevelOrder(root, 1) root = insertInBinaryTreeUsingLevelOrder(root, 2) root = insertInBinaryTreeUsingLevelOrder(root, 3) diff --git a/src/chapter06trees/NumberOfHalfNodesInBTusingLevelOrder.py b/src/chapter06trees/NumberOfHalfNodesInBTusingLevelOrder.py index 427f127..129d186 100644 --- a/src/chapter06trees/NumberOfHalfNodesInBTusingLevelOrder.py +++ b/src/chapter06trees/NumberOfHalfNodesInBTusingLevelOrder.py @@ -16,16 +16,16 @@ def __init__(self, data=None, next=None): self.last = None self.next = next # method for setting the data field of the node - def setData(self, data): + def set_data(self, data): self.data = data # method for getting the data field of the node - def getData(self): + def get_data(self): return self.data # method for setting the next field of the node - def setNext(self, next): + def set_next(self, next): self.next = next # method for getting the next field of the node - def getNext(self): + def get_next(self): return self.next # method for setting the last field of the node def setLast(self, last): @@ -34,7 +34,7 @@ def setLast(self, last): def getLast(self): return self.last # returns true if the node points to another node - def hasNext(self): + def has_next(self): return self.next != None @@ -47,21 +47,21 @@ def __init__(self, data=None): def push(self, data): temp = Node() - temp.setData(data) - temp.setNext(self.head) + temp.set_data(data) + temp.set_next(self.head) self.head = temp def pop(self): if self.head is None: raise IndexError - temp = self.head.getData() - self.head = self.head.getNext() + temp = self.head.get_data() + self.head = self.head.get_next() return temp def peek(self): if self.head is None: raise IndexError - return self.head.getData() + return self.head.get_data() def isEmpty(self): return self.head == None @@ -85,19 +85,19 @@ def queueRear(self): if self.rear is None: print "Sorry, the queue is empty!" raise IndexError - return self.rear.getData() + return self.rear.get_data() def queueFront(self): if self.front is None: print "Sorry, the queue is empty!" raise IndexError - return self.front.getData() + return self.front.get_data() def deQueue(self): if self.rear is None: print "Sorry, the queue is empty!" raise IndexError - result = self.rear.getData() + result = self.rear.get_data() self.rear = self.rear.last self.size -= 1 return result @@ -116,10 +116,10 @@ def __init__(self, data): self.left = None # left child self.right = None # right child # set data - def setData(self, data): + def set_data(self, data): self.data = data # get data - def getData(self): + def get_data(self): return self.data # get left child of a node def getLeft(self): @@ -156,7 +156,7 @@ def insertInBinaryTreeUsingLevelOrder(root, data): while not q.isEmpty(): node = q.deQueue() # dequeue FIFO - if data == node.getData(): + if data == node.get_data(): return root if node.left is not None: q.enQueue(node.left) @@ -208,7 +208,7 @@ def deleteBinaryTree(root): root = BinaryTree(11) -print(root.getData()) +print(root.get_data()) root = insertInBinaryTreeUsingLevelOrder(root, 1) root = insertInBinaryTreeUsingLevelOrder(root, 2) root = insertInBinaryTreeUsingLevelOrder(root, 3) diff --git a/src/chapter06trees/NumberOfLeavesInBTusingLevelOrder.py b/src/chapter06trees/NumberOfLeavesInBTusingLevelOrder.py index d884e84..8ec5aad 100644 --- a/src/chapter06trees/NumberOfLeavesInBTusingLevelOrder.py +++ b/src/chapter06trees/NumberOfLeavesInBTusingLevelOrder.py @@ -16,16 +16,16 @@ def __init__(self, data=None, next=None): self.last = None self.next = next # method for setting the data field of the node - def setData(self, data): + def set_data(self, data): self.data = data # method for getting the data field of the node - def getData(self): + def get_data(self): return self.data # method for setting the next field of the node - def setNext(self, next): + def set_next(self, next): self.next = next # method for getting the next field of the node - def getNext(self): + def get_next(self): return self.next # method for setting the last field of the node def setLast(self, last): @@ -34,7 +34,7 @@ def setLast(self, last): def getLast(self): return self.last # returns true if the node points to another node - def hasNext(self): + def has_next(self): return self.next != None @@ -47,21 +47,21 @@ def __init__(self, data=None): def push(self, data): temp = Node() - temp.setData(data) - temp.setNext(self.head) + temp.set_data(data) + temp.set_next(self.head) self.head = temp def pop(self): if self.head is None: raise IndexError - temp = self.head.getData() - self.head = self.head.getNext() + temp = self.head.get_data() + self.head = self.head.get_next() return temp def peek(self): if self.head is None: raise IndexError - return self.head.getData() + return self.head.get_data() def isEmpty(self): return self.head == None @@ -85,19 +85,19 @@ def queueRear(self): if self.rear is None: print "Sorry, the queue is empty!" raise IndexError - return self.rear.getData() + return self.rear.get_data() def queueFront(self): if self.front is None: print "Sorry, the queue is empty!" raise IndexError - return self.front.getData() + return self.front.get_data() def deQueue(self): if self.rear is None: print "Sorry, the queue is empty!" raise IndexError - result = self.rear.getData() + result = self.rear.get_data() self.rear = self.rear.last self.size -= 1 return result @@ -116,10 +116,10 @@ def __init__(self, data): self.left = None # left child self.right = None # right child # set data - def setData(self, data): + def set_data(self, data): self.data = data # get data - def getData(self): + def get_data(self): return self.data # get left child of a node def getLeft(self): @@ -156,7 +156,7 @@ def insertInBinaryTreeUsingLevelOrder(root, data): while not q.isEmpty(): node = q.deQueue() # dequeue FIFO - if data == node.getData(): + if data == node.get_data(): return root if node.left is not None: q.enQueue(node.left) @@ -208,7 +208,7 @@ def deleteBinaryTree(root): root = BinaryTree(11) -print(root.getData()) +print(root.get_data()) root = insertInBinaryTreeUsingLevelOrder(root, 1) root = insertInBinaryTreeUsingLevelOrder(root, 2) root = insertInBinaryTreeUsingLevelOrder(root, 3) diff --git a/src/chapter06trees/PathsFinder.py b/src/chapter06trees/PathsFinder.py index 8d42790..7527a90 100644 --- a/src/chapter06trees/PathsFinder.py +++ b/src/chapter06trees/PathsFinder.py @@ -16,16 +16,16 @@ def __init__(self, data=None, next=None): self.last = None self.next = next # method for setting the data field of the node - def setData(self, data): + def set_data(self, data): self.data = data # method for getting the data field of the node - def getData(self): + def get_data(self): return self.data # method for setting the next field of the node - def setNext(self, next): + def set_next(self, next): self.next = next # method for getting the next field of the node - def getNext(self): + def get_next(self): return self.next # method for setting the last field of the node def setLast(self, last): @@ -34,7 +34,7 @@ def setLast(self, last): def getLast(self): return self.last # returns true if the node points to another node - def hasNext(self): + def has_next(self): return self.next != None @@ -47,21 +47,21 @@ def __init__(self, data=None): def push(self, data): temp = Node() - temp.setData(data) - temp.setNext(self.head) + temp.set_data(data) + temp.set_next(self.head) self.head = temp def pop(self): if self.head is None: raise IndexError - temp = self.head.getData() - self.head = self.head.getNext() + temp = self.head.get_data() + self.head = self.head.get_next() return temp def peek(self): if self.head is None: raise IndexError - return self.head.getData() + return self.head.get_data() def isEmpty(self): return self.head == None @@ -85,19 +85,19 @@ def queueRear(self): if self.rear is None: print "Sorry, the queue is empty!" raise IndexError - return self.rear.getData() + return self.rear.get_data() def queueFront(self): if self.front is None: print "Sorry, the queue is empty!" raise IndexError - return self.front.getData() + return self.front.get_data() def deQueue(self): if self.rear is None: print "Sorry, the queue is empty!" raise IndexError - result = self.rear.getData() + result = self.rear.get_data() self.rear = self.rear.last self.size -= 1 return result @@ -116,10 +116,10 @@ def __init__(self, data): self.left = None # left child self.right = None # right child # set data - def setData(self, data): + def set_data(self, data): self.data = data # get data - def getData(self): + def get_data(self): return self.data # get left child of a node def getLeft(self): @@ -156,7 +156,7 @@ def insertInBinaryTreeUsingLevelOrder(root, data): while not q.isEmpty(): node = q.deQueue() # dequeue FIFO - if data == node.getData(): + if data == node.get_data(): return root if node.left is not None: q.enQueue(node.left) @@ -222,7 +222,7 @@ def pathsFinder(root): print 'paths:', paths root = BinaryTree(11) -print(root.getData()) +print(root.get_data()) root = insertInBinaryTreeUsingLevelOrder(root, 1) root = insertInBinaryTreeUsingLevelOrder(root, 2) root = insertInBinaryTreeUsingLevelOrder(root, 3) diff --git a/src/chapter06trees/QuasiIsomorphicCheck.py b/src/chapter06trees/QuasiIsomorphicCheck.py index 60c5537..f6a1423 100644 --- a/src/chapter06trees/QuasiIsomorphicCheck.py +++ b/src/chapter06trees/QuasiIsomorphicCheck.py @@ -15,10 +15,10 @@ def __init__(self, data): self.left = None # left child self.right = None # right child # set data - def setData(self, data): + def set_data(self, data): self.data = data # get data - def getData(self): + def get_data(self): return self.data # get left child of a node def getLeft(self): @@ -140,7 +140,7 @@ def quasiIsomorphic(root1, root2): root1.insertLeft(10) root1.insertLeft(1100) root1.insertRight(5) -root1.getRight().setData(2) +root1.getRight().set_data(2) postorderIterative(root1) root2 = BinaryTree(99) @@ -148,6 +148,6 @@ def quasiIsomorphic(root1, root2): root2.insertLeft(910) root2.insertLeft(9900) root2.insertRight(8) -root2.getRight().setData(2) +root2.getRight().set_data(2) postorderIterative(root2) print "QuasiIsomorphic:", quasiIsomorphic(root1, root2) diff --git a/src/chapter06trees/RangePrinterBST.py b/src/chapter06trees/RangePrinterBST.py index 57d4694..713051a 100644 --- a/src/chapter06trees/RangePrinterBST.py +++ b/src/chapter06trees/RangePrinterBST.py @@ -11,12 +11,12 @@ def rangePrinter(root, K1, K2): if not root: return - if K1 <= root.getData() <= K2: - print(root.getData()) - if root.getData() < K1: - return rangePrinter(root.getRight()) - if root.getData() > K2: - return rangePrinter(root.getLeft()) + if K1 <= root.get_data() <= K2: + print(root.get_data()) + if root.get_data() < K1: + return rangePrinter(root.getRight(), K1, K2) + if root.get_data() > K2: + return rangePrinter(root.getLeft(), K1, K2) import Queue @@ -30,11 +30,11 @@ def rangePrinter(root): while not q.empty(): temp = q.get() # dequeue FIFO - if K1 <= root.getData() <= K2: - print(root.getData()) - if temp.getLeft() is not None and temp.getData() >= K1: + if K1 <= root.get_data() <= K2: + print(root.get_data()) + if temp.getLeft() is not None and temp.get_data() >= K1: q.put(temp.getLeft()) - if temp.getRight() is not None and temp.getData() <= K2: + if temp.getRight() is not None and temp.get_data() <= K2: q.put(temp.getRight()) diff --git a/src/chapter06trees/RemoveHalfNodesFromBinaryTree.py b/src/chapter06trees/RemoveHalfNodesFromBinaryTree.py index 5928b27..4c802b5 100644 --- a/src/chapter06trees/RemoveHalfNodesFromBinaryTree.py +++ b/src/chapter06trees/RemoveHalfNodesFromBinaryTree.py @@ -16,16 +16,16 @@ def __init__(self, data=None, next=None): self.last = None self.next = next # method for setting the data field of the node - def setData(self, data): + def set_data(self, data): self.data = data # method for getting the data field of the node - def getData(self): + def get_data(self): return self.data # method for setting the next field of the node - def setNext(self, next): + def set_next(self, next): self.next = next # method for getting the next field of the node - def getNext(self): + def get_next(self): return self.next # method for setting the last field of the node def setLast(self, last): @@ -34,7 +34,7 @@ def setLast(self, last): def getLast(self): return self.last # returns true if the node points to another node - def hasNext(self): + def has_next(self): return self.next != None @@ -57,19 +57,19 @@ def queueRear(self): if self.rear is None: print "Sorry, the queue is empty!" raise IndexError - return self.rear.getData() + return self.rear.get_data() def queueFront(self): if self.front is None: print "Sorry, the queue is empty!" raise IndexError - return self.front.getData() + return self.front.get_data() def deQueue(self): if self.rear is None: print "Sorry, the queue is empty!" raise IndexError - result = self.rear.getData() + result = self.rear.get_data() self.rear = self.rear.last self.size -= 1 return result @@ -84,10 +84,10 @@ def __init__(self, data): self.left = None # left child self.right = None # right child # set data - def setData(self, data): + def set_data(self, data): self.data = data # get data - def getData(self): + def get_data(self): return self.data # get left child of a node def getLeft(self): @@ -209,7 +209,7 @@ def removeHalfNodes(root): root.insertLeft(10) root.insertLeft(1100) root.insertRight(5) -root.getRight().setData(2) +root.getRight().set_data(2) result = [] postorderIterative(root, result) print result diff --git a/src/chapter06trees/RemoveLeavesOfBinaryTree.py b/src/chapter06trees/RemoveLeavesOfBinaryTree.py index 009dc14..2c161e3 100644 --- a/src/chapter06trees/RemoveLeavesOfBinaryTree.py +++ b/src/chapter06trees/RemoveLeavesOfBinaryTree.py @@ -16,16 +16,16 @@ def __init__(self, data=None, next=None): self.last = None self.next = next # method for setting the data field of the node - def setData(self, data): + def set_data(self, data): self.data = data # method for getting the data field of the node - def getData(self): + def get_data(self): return self.data # method for setting the next field of the node - def setNext(self, next): + def set_next(self, next): self.next = next # method for getting the next field of the node - def getNext(self): + def get_next(self): return self.next # method for setting the last field of the node def setLast(self, last): @@ -34,7 +34,7 @@ def setLast(self, last): def getLast(self): return self.last # returns true if the node points to another node - def hasNext(self): + def has_next(self): return self.next != None @@ -57,19 +57,19 @@ def queueRear(self): if self.rear is None: print "Sorry, the queue is empty!" raise IndexError - return self.rear.getData() + return self.rear.get_data() def queueFront(self): if self.front is None: print "Sorry, the queue is empty!" raise IndexError - return self.front.getData() + return self.front.get_data() def deQueue(self): if self.rear is None: print "Sorry, the queue is empty!" raise IndexError - result = self.rear.getData() + result = self.rear.get_data() self.rear = self.rear.last self.size -= 1 return result @@ -84,10 +84,10 @@ def __init__(self, data): self.left = None # left child self.right = None # right child # set data - def setData(self, data): + def set_data(self, data): self.data = data # get data - def getData(self): + def get_data(self): return self.data # get left child of a node def getLeft(self): @@ -205,7 +205,7 @@ def removeLeaves(root): root.insertLeft(10) root.insertLeft(1100) root.insertRight(5) -root.getRight().setData(2) +root.getRight().set_data(2) result = [] postorderIterative(root, result) print result diff --git a/src/chapter06trees/SizeofBinaryTreeRecursive.py b/src/chapter06trees/SizeofBinaryTreeRecursive.py index 88a71cd..831259d 100644 --- a/src/chapter06trees/SizeofBinaryTreeRecursive.py +++ b/src/chapter06trees/SizeofBinaryTreeRecursive.py @@ -16,16 +16,16 @@ def __init__(self, data=None, next=None): self.last = None self.next = next # method for setting the data field of the node - def setData(self, data): + def set_data(self, data): self.data = data # method for getting the data field of the node - def getData(self): + def get_data(self): return self.data # method for setting the next field of the node - def setNext(self, next): + def set_next(self, next): self.next = next # method for getting the next field of the node - def getNext(self): + def get_next(self): return self.next # method for setting the last field of the node def setLast(self, last): @@ -34,7 +34,7 @@ def setLast(self, last): def getLast(self): return self.last # returns true if the node points to another node - def hasNext(self): + def has_next(self): return self.next != None @@ -57,19 +57,19 @@ def queueRear(self): if self.rear is None: print "Sorry, the queue is empty!" raise IndexError - return self.rear.getData() + return self.rear.get_data() def queueFront(self): if self.front is None: print "Sorry, the queue is empty!" raise IndexError - return self.front.getData() + return self.front.get_data() def deQueue(self): if self.rear is None: print "Sorry, the queue is empty!" raise IndexError - result = self.rear.getData() + result = self.rear.get_data() self.rear = self.rear.last self.size -= 1 return result @@ -88,10 +88,10 @@ def __init__(self, data): self.left = None # left child self.right = None # right child # set data - def setData(self, data): + def set_data(self, data): self.data = data # get data - def getData(self): + def get_data(self): return self.data # get left child of a node def getLeft(self): @@ -128,7 +128,7 @@ def insertInBinaryTreeUsingLevelOrder(root, data): while not q.isEmpty(): node = q.deQueue() # dequeue FIFO - if data == node.getData(): + if data == node.get_data(): return root if node.left is not None: q.enQueue(node.left) @@ -157,7 +157,7 @@ def inorderRecursive(root): root = BinaryTree(11) -print(root.getData()) +print(root.get_data()) root = insertInBinaryTreeUsingLevelOrder(root, 1) root = insertInBinaryTreeUsingLevelOrder(root, 2) root = insertInBinaryTreeUsingLevelOrder(root, 3) diff --git a/src/chapter06trees/SortedLinikedListToBST.py b/src/chapter06trees/SortedLinikedListToBST.py index 5e26233..142e68c 100644 --- a/src/chapter06trees/SortedLinikedListToBST.py +++ b/src/chapter06trees/SortedLinikedListToBST.py @@ -15,19 +15,19 @@ def __init__(self, data): self.data = data self.next = None # method for setting the data field of the node - def setData(self, data): + def set_data(self, data): self.data = data # method for getting the data field of the node - def getData(self): + def get_data(self): return self.data # method for setting the next field of the node - def setNext(self, next): + def set_next(self, next): self.next = next # method for getting the next field of the node - def getNext(self): + def get_next(self): return self.next # returns true if the node points to another node - def hasNext(self): + def has_next(self): return self.next != None # class for defining a linked list diff --git a/src/chapter06trees/SumofAllElementsInTree.py b/src/chapter06trees/SumofAllElementsInTree.py index b83d566..4823b20 100644 --- a/src/chapter06trees/SumofAllElementsInTree.py +++ b/src/chapter06trees/SumofAllElementsInTree.py @@ -16,16 +16,16 @@ def __init__(self, data=None, next=None): self.last = None self.next = next # method for setting the data field of the node - def setData(self, data): + def set_data(self, data): self.data = data # method for getting the data field of the node - def getData(self): + def get_data(self): return self.data # method for setting the next field of the node - def setNext(self, next): + def set_next(self, next): self.next = next # method for getting the next field of the node - def getNext(self): + def get_next(self): return self.next # method for setting the last field of the node def setLast(self, last): @@ -34,7 +34,7 @@ def setLast(self, last): def getLast(self): return self.last # returns true if the node points to another node - def hasNext(self): + def has_next(self): return self.next != None @@ -47,21 +47,21 @@ def __init__(self, data=None): def push(self, data): temp = Node() - temp.setData(data) - temp.setNext(self.head) + temp.set_data(data) + temp.set_next(self.head) self.head = temp def pop(self): if self.head is None: raise IndexError - temp = self.head.getData() - self.head = self.head.getNext() + temp = self.head.get_data() + self.head = self.head.get_next() return temp def peek(self): if self.head is None: raise IndexError - return self.head.getData() + return self.head.get_data() def isEmpty(self): return self.head == None @@ -85,19 +85,19 @@ def queueRear(self): if self.rear is None: print "Sorry, the queue is empty!" raise IndexError - return self.rear.getData() + return self.rear.get_data() def queueFront(self): if self.front is None: print "Sorry, the queue is empty!" raise IndexError - return self.front.getData() + return self.front.get_data() def deQueue(self): if self.rear is None: print "Sorry, the queue is empty!" raise IndexError - result = self.rear.getData() + result = self.rear.get_data() self.rear = self.rear.last self.size -= 1 return result @@ -116,10 +116,10 @@ def __init__(self, data): self.left = None # left child self.right = None # right child # set data - def setData(self, data): + def set_data(self, data): self.data = data # get data - def getData(self): + def get_data(self): return self.data # get left child of a node def getLeft(self): @@ -156,7 +156,7 @@ def insertInBinaryTreeUsingLevelOrder(root, data): while not q.isEmpty(): node = q.deQueue() # dequeue FIFO - if data == node.getData(): + if data == node.get_data(): return root if node.left is not None: q.enQueue(node.left) @@ -178,7 +178,7 @@ def sumInBinaryTreeLevelOrder(root): sum = 0 while not q.isEmpty(): node = q.deQueue() # dequeue FIFO - sum += node.getData() + sum += node.get_data() if node.left is not None: q.enQueue(node.left) diff --git a/src/chapter06trees/TreeCompressionWithLevelOrder.py b/src/chapter06trees/TreeCompressionWithLevelOrder.py index 7d8fc00..e8e7a08 100644 --- a/src/chapter06trees/TreeCompressionWithLevelOrder.py +++ b/src/chapter06trees/TreeCompressionWithLevelOrder.py @@ -16,16 +16,16 @@ def __init__(self, data=None, next=None): self.last = None self.next = next # method for setting the data field of the node - def setData(self, data): + def set_data(self, data): self.data = data # method for getting the data field of the node - def getData(self): + def get_data(self): return self.data # method for setting the next field of the node - def setNext(self, next): + def set_next(self, next): self.next = next # method for getting the next field of the node - def getNext(self): + def get_next(self): return self.next # method for setting the last field of the node def setLast(self, last): @@ -34,7 +34,7 @@ def setLast(self, last): def getLast(self): return self.last # returns true if the node points to another node - def hasNext(self): + def has_next(self): return self.next != None class Queue(object): @@ -56,19 +56,19 @@ def queueRear(self): if self.rear is None: print "Sorry, the queue is empty!" raise IndexError - return self.rear.getData() + return self.rear.get_data() def queueFront(self): if self.front is None: print "Sorry, the queue is empty!" raise IndexError - return self.front.getData() + return self.front.get_data() def deQueue(self): if self.rear is None: print "Sorry, the queue is empty!" raise IndexError - result = self.rear.getData() + result = self.rear.get_data() self.rear = self.rear.last self.size -= 1 return result @@ -90,10 +90,10 @@ def __init__(self, data, data2): self.right = None # set data - def setData(self, data): + def set_data(self, data): self.data = data # get data - def getData(self): + def get_data(self): return self.data # get left child of a node def getLeft(self): diff --git a/src/chapter06trees/TrimBST.py b/src/chapter06trees/TrimBST.py index dfc13c6..c7f10be 100644 --- a/src/chapter06trees/TrimBST.py +++ b/src/chapter06trees/TrimBST.py @@ -13,10 +13,10 @@ def trimBST(root, minVal, maxVal): return root.setLeft(trimBST(root.getLeft(), minVal, maxVal)) root.setRight(trimBST(root.getRight(), minVal, maxVal)) - if minVal <= root.getData() <= maxVal: + if minVal <= root.get_data() <= maxVal: return root - if root.getData() < minVal: + if root.get_data() < minVal: return root.getRight() - if root.getData() > maxVal: + if root.get_data() > maxVal: return root.getLeft() diff --git a/src/chapter06trees/VerticalSumInBinaryTree.py b/src/chapter06trees/VerticalSumInBinaryTree.py index e9f077b..ac40c62 100644 --- a/src/chapter06trees/VerticalSumInBinaryTree.py +++ b/src/chapter06trees/VerticalSumInBinaryTree.py @@ -15,10 +15,10 @@ def __init__(self, data): self.left = None # left child self.right = None # right child # set data - def setData(self, data): + def set_data(self, data): self.data = data # get data - def getData(self): + def get_data(self): return self.data # get left child of a node def getLeft(self): @@ -131,7 +131,7 @@ def levelOrder(root, result): while not q.empty(): n = q.get() # dequeue FIFO - result.append(node.getData()) + result.append(node.get_data()) if n.left is not None: q.put(n.left) @@ -139,16 +139,16 @@ def levelOrder(root, result): q.put(n.right) root = BinaryTree(11) -print(root.getData()) +print(root.get_data()) root.insertLeft(1) root.insertLeft(10) root.insertLeft(1100) -print(root.getLeft().getData()) +print(root.getLeft().get_data()) root.insertRight(5) -print(root.getRight().getData()) -root.getRight().setData(2) -print(root.getRight().getData()) +print(root.getRight().get_data()) +root.getRight().set_data(2) +print(root.getRight().get_data()) hashTable = {} def VerticalSumInBinaryTree(root, column): diff --git a/src/chapter09graphs/BFS.py b/src/chapter09graphs/BFS.py index 380edd2..98a64a3 100644 --- a/src/chapter09graphs/BFS.py +++ b/src/chapter09graphs/BFS.py @@ -1,225 +1,218 @@ -# Copyright (c) Dec 22, 2014 CareerMonk Publications and others. -# E-Mail : info@careermonk.com -# Creation Date : 2014-01-10 06:15:46 -# Last modification : 2008-10-31 -# by : Narasimha Karumanchi -# Book Title : Data Structures And Algorithmic Thinking With Python -# Warranty : This software is provided "as is" without any -# warranty; without even the implied warranty of -# merchantability or fitness for a particular purpose. - -# Node of a Singly Linked List -class Node: - # constructor - def __init__(self, data=None, next=None): - self.data = data - self.last = None - self.next = next - # method for setting the data field of the node - def setData(self, data): - self.data = data - # method for getting the data field of the node - def getData(self): - return self.data - # method for setting the next field of the node - def setNext(self, next): - self.next = next - # method for getting the next field of the node - def getNext(self): - return self.next - # method for setting the last field of the node - def setLast(self, last): - self.last = last - # method for getting the last field of the node - def getLast(self): - return self.last - # returns true if the node points to another node - def hasNext(self): - return self.next != None - - -class Queue(object): - def __init__(self, data=None): - self.front = None - self.rear = None - self.size = 0 - - def enQueue(self, data): - self.lastNode = self.front - self.front = Node(data, self.front) - if self.lastNode: - self.lastNode.setLast(self.front) - if self.rear is None: - self.rear = self.front - self.size += 1 - - def queueRear(self): - if self.rear is None: - print "Sorry, the queue is empty!" - raise IndexError - return self.rear.getData() - - def queueFront(self): - if self.front is None: - print "Sorry, the queue is empty!" - raise IndexError - return self.front.getData() - - def deQueue(self): - if self.rear is None: - print "Sorry, the queue is empty!" - raise IndexError - result = self.rear.getData() - self.rear = self.rear.last - self.size -= 1 - return result - - def size(self): - return self.size - -import sys -class Vertex: - def __init__(self, node): - self.id = node - self.adjacent = {} - # Set distance to infinity for all nodes - self.distance = sys.maxint - # Mark all nodes unvisited - self.visited = False - # Mark all nodes color with white - self.color = 'white' - # Predecessor - self.previous = None - - def addNeighbor(self, neighbor, weight=0): - self.adjacent[neighbor] = weight - - def getConnections(self): - return self.adjacent.keys() - - def getVertexID(self): - return self.id - - def getWeight(self, neighbor): - return self.adjacent[neighbor] - - def setDistance(self, dist): - self.distance = dist - - def getDistance(self): - return self.distance - - def setColor(self, color): - self.color = color - - def getColor(self): - return self.color - - def setPrevious(self, prev): - self.previous = prev - - def setVisited(self): - self.visited = True - - def __str__(self): - return str(self.id) + ' adjacent: ' + str([x.id for x in self.adjacent]) - -class Graph: - def __init__(self): - self.vertDictionary = {} - self.numVertices = 0 - - def __iter__(self): - return iter(self.vertDictionary.values()) - - def addVertex(self, node): - self.numVertices = self.numVertices + 1 - newVertex = Vertex(node) - self.vertDictionary[node] = newVertex - return newVertex - - def getVertex(self, n): - if n in self.vertDictionary: - return self.vertDictionary[n] - else: - return None - - def addEdge(self, frm, to, cost=0): - if frm not in self.vertDictionary: - self.addVertex(frm) - if to not in self.vertDictionary: - self.addVertex(to) - - self.vertDictionary[frm].addNeighbor(self.vertDictionary[to], cost) - # For directed graph do not add this - self.vertDictionary[to].addNeighbor(self.vertDictionary[frm], cost) - - def getVertices(self): - return self.vertDictionary.keys() - - def setPrevious(self, current): - self.previous = current - - def getPrevious(self, current): - return self.previous - - def getEdges(self): - edges = [] - for v in G: - for w in v.getConnections(): - vid = v.getVertexID() - wid = w.getVertexID() - edges.append((vid, wid, v.getWeight(w))) - return edges - -def dfs(G, u, visited): - visited[u] = True # mark the visited node - print "traversal: " + u.getVertexID() - for neighbourNodes in u.getConnections(): # take a neighbouring node - if neighbourNodes not in visited: # condition to check whether the neighbour node is already visited - dfs(G, neighbourNodes, visited) # recursively traverse the neighbouring node - -def BFSTraversal(G, s): - start = G.getVertex(s) - start.setDistance(0) - start.setPrevious(None) - vertQueue = Queue() - vertQueue.enQueue(start) - - while (vertQueue.size > 0): - currentVert = vertQueue.deQueue() - print currentVert.getVertexID() - for nbr in currentVert.getConnections(): - if (nbr.getColor() == 'white'): - nbr.setColor('gray') - nbr.setDistance(currentVert.getDistance() + 1) - nbr.setPrevious(currentVert) - vertQueue.enQueue(nbr) - currentVert.setColor('black') - -def BFS(G): - for v in G: - if (v.getColor() == 'white'): - BFSTraversal(G, v.getVertexID()) - -if __name__ == '__main__': - - G = Graph() - G.addVertex('a') - G.addVertex('b') - G.addVertex('c') - G.addVertex('d') - G.addVertex('e') - G.addVertex('f') - G.addEdge('a', 'b', 1) - G.addEdge('a', 'c', 1) - G.addEdge('b', 'd', 1) - G.addEdge('b', 'e', 1) - G.addEdge('c', 'd', 1) - G.addEdge('c', 'e', 1) - G.addEdge('d', 'e', 1) - G.addEdge('e', 'a', 1) - print 'Graph data:' - print G.getEdges() - - BFS(G) +# Copyright (c) Dec 22, 2014 CareerMonk Publications and others. +# E-Mail : info@careermonk.com +# Creation Date : 2014-01-10 06:15:46 +# Last modification : 2008-10-31 +# by : Narasimha Karumanchi +# Book Title : Data Structures And Algorithmic Thinking With Python +# Warranty : This software is provided "as is" without any +# warranty; without even the implied warranty of +# merchantability or fitness for a particular purpose. + +# Node of a Singly Linked List +class Node: + # constructor + def __init__(self, data=None, next=None): + self.data = data + self.last = None + self.next = next + # method for setting the data field of the node + def set_data(self, data): + self.data = data + # method for getting the data field of the node + def get_data(self): + return self.data + # method for setting the next field of the node + def set_next(self, next): + self.next = next + # method for getting the next field of the node + def get_next(self): + return self.next + # method for setting the last field of the node + def setLast(self, last): + self.last = last + # method for getting the last field of the node + def getLast(self): + return self.last + # returns true if the node points to another node + def has_next(self): + return self.next != None + + +class Queue(object): + def __init__(self, data=None): + self.front = None + self.rear = None + self.size = 0 + + def enQueue(self, data): + self.lastNode = self.front + self.front = Node(data, self.front) + if self.lastNode: + self.lastNode.setLast(self.front) + if self.rear is None: + self.rear = self.front + self.size += 1 + + def queueRear(self): + if self.rear is None: + print "Sorry, the queue is empty!" + raise IndexError + return self.rear.get_data() + + def queueFront(self): + if self.front is None: + print "Sorry, the queue is empty!" + raise IndexError + return self.front.get_data() + + def deQueue(self): + if self.rear is None: + print "Sorry, the queue is empty!" + raise IndexError + result = self.rear.get_data() + self.rear = self.rear.last + self.size -= 1 + return result + + def size(self): + return self.size + +import sys +class Vertex: + def __init__(self, node): + self.id = node + self.adjacent = {} + # Set distance to infinity for all nodes + self.distance = sys.maxint + # Mark all nodes unvisited + self.visited = False + # Mark all nodes color with white + self.color = 'white' + # Predecessor + self.previous = None + + def addNeighbor(self, neighbor, weight=0): + self.adjacent[neighbor] = weight + + def getConnections(self): + return self.adjacent.keys() + + def getVertexID(self): + return self.id + + def getWeight(self, neighbor): + return self.adjacent[neighbor] + + def setDistance(self, dist): + self.distance = dist + + def getDistance(self): + return self.distance + + def setColor(self, color): + self.color = color + + def getColor(self): + return self.color + + def setPrevious(self, prev): + self.previous = prev + + def setVisited(self): + self.visited = True + + def __str__(self): + return str(self.id) + ' adjacent: ' + str([x.id for x in self.adjacent]) + +class Graph: + def __init__(self): + self.vertDictionary = {} + self.numVertices = 0 + + def __iter__(self): + return iter(self.vertDictionary.values()) + + def addVertex(self, node): + self.numVertices = self.numVertices + 1 + newVertex = Vertex(node) + self.vertDictionary[node] = newVertex + return newVertex + + def getVertex(self, n): + if n in self.vertDictionary: + return self.vertDictionary[n] + else: + return None + + def addEdge(self, frm, to, cost=0): + if frm not in self.vertDictionary: + self.addVertex(frm) + if to not in self.vertDictionary: + self.addVertex(to) + + self.vertDictionary[frm].addNeighbor(self.vertDictionary[to], cost) + # For directed graph do not add this + self.vertDictionary[to].addNeighbor(self.vertDictionary[frm], cost) + + def getVertices(self): + return self.vertDictionary.keys() + + def setPrevious(self, current): + self.previous = current + + def getPrevious(self, current): + return self.previous + + def getEdges(self): + edges = [] + for v in G: + for w in v.getConnections(): + vid = v.getVertexID() + wid = w.getVertexID() + edges.append((vid, wid, v.getWeight(w))) + return edges + +def BFSTraversal(G, s): + start = G.getVertex(s) + start.setDistance(0) + start.setPrevious(None) + vertQueue = Queue() + vertQueue.enQueue(start) + + while (vertQueue.size > 0): + currentVert = vertQueue.deQueue() + print currentVert.getVertexID() + for nbr in currentVert.getConnections(): + if (nbr.getColor() == 'white'): + nbr.setColor('gray') + nbr.setDistance(currentVert.getDistance() + 1) + nbr.setPrevious(currentVert) + vertQueue.enQueue(nbr) + currentVert.setColor('black') + +def BFS(G): + for v in G: + if (v.getColor() == 'white'): + BFSTraversal(G, v.getVertexID()) + +if __name__ == '__main__': + + G = Graph() + G.addVertex('a') + G.addVertex('b') + G.addVertex('c') + G.addVertex('d') + G.addVertex('e') + G.addVertex('f') + G.addEdge('a', 'b', 1) + G.addEdge('a', 'c', 1) + G.addEdge('b', 'd', 1) + G.addEdge('b', 'e', 1) + G.addEdge('c', 'd', 1) + G.addEdge('c', 'e', 1) + G.addEdge('d', 'e', 1) + G.addEdge('e', 'a', 1) + print 'Graph data:' + print G.getEdges() + + BFS(G) diff --git a/src/chapter09graphs/CountConnectedComponentsWithBFS.py b/src/chapter09graphs/CountConnectedComponentsWithBFS.py index aced9ee..94730d4 100644 --- a/src/chapter09graphs/CountConnectedComponentsWithBFS.py +++ b/src/chapter09graphs/CountConnectedComponentsWithBFS.py @@ -16,16 +16,16 @@ def __init__(self, data=None, next=None): self.last = None self.next = next # method for setting the data field of the node - def setData(self, data): + def set_data(self, data): self.data = data # method for getting the data field of the node - def getData(self): + def get_data(self): return self.data # method for setting the next field of the node - def setNext(self, next): + def set_next(self, next): self.next = next # method for getting the next field of the node - def getNext(self): + def get_next(self): return self.next # method for setting the last field of the node def setLast(self, last): @@ -34,7 +34,7 @@ def setLast(self, last): def getLast(self): return self.last # returns true if the node points to another node - def hasNext(self): + def has_next(self): return self.next != None class Queue(object): @@ -56,19 +56,19 @@ def queueRear(self): if self.rear is None: print "Sorry, the queue is empty!" raise IndexError - return self.rear.getData() + return self.rear.get_data() def queueFront(self): if self.front is None: print "Sorry, the queue is empty!" raise IndexError - return self.front.getData() + return self.front.get_data() def deQueue(self): if self.rear is None: print "Sorry, the queue is empty!" raise IndexError - result = self.rear.getData() + result = self.rear.get_data() self.rear = self.rear.last self.size -= 1 return result diff --git a/src/chapter09graphs/LongestPathInDAG.py b/src/chapter09graphs/LongestPathInDAG.py index e87a369..e0201ae 100644 --- a/src/chapter09graphs/LongestPathInDAG.py +++ b/src/chapter09graphs/LongestPathInDAG.py @@ -16,16 +16,16 @@ def __init__(self, data=None, next=None): self.last = None self.next = next # method for setting the data field of the node - def setData(self, data): + def set_data(self, data): self.data = data # method for getting the data field of the node - def getData(self): + def get_data(self): return self.data # method for setting the next field of the node - def setNext(self, next): + def set_next(self, next): self.next = next # method for getting the next field of the node - def getNext(self): + def get_next(self): return self.next # method for setting the last field of the node def setLast(self, last): @@ -34,7 +34,7 @@ def setLast(self, last): def getLast(self): return self.last # returns true if the node points to another node - def hasNext(self): + def has_next(self): return self.next != None @@ -57,19 +57,19 @@ def queueRear(self): if self.rear is None: print "Sorry, the queue is empty!" raise IndexError - return self.rear.getData() + return self.rear.get_data() def queueFront(self): if self.front is None: print "Sorry, the queue is empty!" raise IndexError - return self.front.getData() + return self.front.get_data() def deQueue(self): if self.rear is None: print "Sorry, the queue is empty!" raise IndexError - result = self.rear.getData() + result = self.rear.get_data() self.rear = self.rear.last self.size -= 1 return result diff --git a/src/chapter09graphs/UnweightedShortestPathWithBFS.py b/src/chapter09graphs/UnweightedShortestPathWithBFS.py index e6747e7..fd24705 100644 --- a/src/chapter09graphs/UnweightedShortestPathWithBFS.py +++ b/src/chapter09graphs/UnweightedShortestPathWithBFS.py @@ -16,16 +16,16 @@ def __init__(self, data=None, next=None): self.last = None self.next = next # method for setting the data field of the node - def setData(self, data): + def set_data(self, data): self.data = data # method for getting the data field of the node - def getData(self): + def get_data(self): return self.data # method for setting the next field of the node - def setNext(self, next): + def set_next(self, next): self.next = next # method for getting the next field of the node - def getNext(self): + def get_next(self): return self.next # method for setting the last field of the node def setLast(self, last): @@ -34,7 +34,7 @@ def setLast(self, last): def getLast(self): return self.last # returns true if the node points to another node - def hasNext(self): + def has_next(self): return self.next != None @@ -57,19 +57,19 @@ def queueRear(self): if self.rear is None: print "Sorry, the queue is empty!" raise IndexError - return self.rear.getData() + return self.rear.get_data() def queueFront(self): if self.front is None: print "Sorry, the queue is empty!" raise IndexError - return self.front.getData() + return self.front.get_data() def deQueue(self): if self.rear is None: print "Sorry, the queue is empty!" raise IndexError - result = self.rear.getData() + result = self.rear.get_data() self.rear = self.rear.last self.size -= 1 return result diff --git a/src/chapter10sorting/CountingSort.py b/src/chapter10sorting/CountingSort.py index d4eb9e2..cce4b6f 100644 --- a/src/chapter10sorting/CountingSort.py +++ b/src/chapter10sorting/CountingSort.py @@ -31,3 +31,19 @@ def CountingSort(A, k): A = [534, 246, 933, 127, 277, 321, 454, 565, 220] print(CountingSort(A, 1000)) + +def counting_sort(A, k): + """in-place counting sort""" + n = len(A) + m = k + 1 + C = [0] * m + for a in A: + C[a] += 1 + i = 0 + for a in range(m): + for c in range(C[a]): + A[i] = a + i += 1 + return A + +print counting_sort( [1, 4, 7, 2, 1, 3, 2, 1, 4, 2, 3, 2, 1], 7 ) diff --git a/src/chapter10sorting/QuickSort2.py b/src/chapter10sorting/QuickSort2.py new file mode 100644 index 0000000..ab42dd5 --- /dev/null +++ b/src/chapter10sorting/QuickSort2.py @@ -0,0 +1,34 @@ +# Copyright (c) Dec 22, 2014 CareerMonk Publications and others. +# E-Mail : info@careermonk.com +# Creation Date : 2014-01-10 06:15:46 +# Last modification : 2008-10-31 +# by : Narasimha Karumanchi +# Book Title : Data Structures And Algorithmic Thinking With Python +# Warranty : This software is provided "as is" without any +# warranty; without even the implied warranty of +# merchantability or fitness for a particular purpose. + +def quickSort(A,low,high): + if low >= high: + return + pivot = A[low] + i = low+1 + j = high + while i <= j: + while i <= j and A[i] <= pivot: + i = i + 1 + while A[j] >= pivot and j >= i: + j = j -1 + if j < i: + break + A[i], A[j] = A[j], A[i] + + A[low], A[j] = A[j], A[low] + partitionPoint = j + + quickSort(A,low,partitionPoint-1) + quickSort(A,partitionPoint+1,high) + +A = [5, 1, 32, 54, 12, 6, 32, 2, 5, 19, 99, 9] +quickSort(A,0,len(A)-1) +print(A) diff --git a/src/chapter11searching/CheckDuplicatesNegationTechnique.py b/src/chapter11searching/CheckDuplicatesNegationTechnique.py index 7b796b1..efdc741 100644 --- a/src/chapter11searching/CheckDuplicatesNegationTechnique.py +++ b/src/chapter11searching/CheckDuplicatesNegationTechnique.py @@ -10,13 +10,12 @@ import math def CheckDuplicatesNegationTechnique(A): - A.sort() for i in range(0, len(A)): if(A[abs(A[i])] < 0): print("Duplicates exist:", A[i]) return else: - A[A[i]] = -A[A[i]] + A[abs(A[i])] *= -1 print("No duplicates in given array.") diff --git a/src/chapter11searching/CheckDuplicatesSorting.py b/src/chapter11searching/CheckDuplicatesSorting.py index 7386f1c..c03a218 100644 --- a/src/chapter11searching/CheckDuplicatesSorting.py +++ b/src/chapter11searching/CheckDuplicatesSorting.py @@ -11,10 +11,9 @@ def CheckDuplicatesSorting(A): A.sort() for i in range(0, len(A) - 1): - for j in range(i + 1, len(A)): - if(A[i] == A[i + 1]): - print("Duplicates exist:", A[i]) - return; + if(A[i] == A[i + 1]): + print("Duplicates exist:", A[i]) + return print("No duplicates in given array.") A = [33, 2, 10, 20, 22, 32] diff --git a/src/chapter11searching/InterpolationSearch.py b/src/chapter11searching/InterpolationSearch.py new file mode 100644 index 0000000..3c12865 --- /dev/null +++ b/src/chapter11searching/InterpolationSearch.py @@ -0,0 +1,28 @@ +# Copyright (c) Dec 22, 2014 CareerMonk Publications and others. +# E-Mail : info@careermonk.com +# Creation Date : 2014-01-10 06:15:46 +# Last modification : 2008-10-31 +# by : Narasimha Karumanchi +# Book Title : Data Structures And Algorithmic Thinking With Python +# Warranty : This software is provided "as is" without any +# warranty; without even the implied warranty of +# merchantability or fitness for a particular purpose. + +def InterpolationSearch(numbersList, value): + low = 0 + high = len(numbersList) - 1 + while numbersList[low] <= value and numbersList[high] >= value: + mid = (low + ((value - numbersList[low]) * (high - low)) + / (numbersList[high] - numbersList[low])) + if numbersList[mid] < value: + low = mid + 1 + elif numbersList[mid] > value: + high = mid - 1 + else: + return mid + if numbersList[low] == value: + return low + return None + +A = [-30,-16,-9,3,10,11,18,22,54,84,105] +print InterpolationSearch(A, -9) diff --git a/src/chapter11searching/KthNode.py b/src/chapter11searching/KthNode.py new file mode 100644 index 0000000..0a59163 --- /dev/null +++ b/src/chapter11searching/KthNode.py @@ -0,0 +1,71 @@ +# Copyright (c) Oct 22, 2018 CareerMonk Publications and others. +# E-Mail : info@careermonk.com +# Creation Date : 2014-01-10 06:15:46 +# Last modification : 2008-10-31 +# by : Narasimha Karumanchi +# Book Title : Data Structures And Algorithmic Thinking With Python +# Warranty : This software is provided "as is" without any +# warranty; without even the implied warranty of +# merchantability or fitness for a particular purpose. +class Node: + def __init__(self, data = None): + self.data = data + self.next = None + +class LinkedList: + def __init__(self, node = None): + self.head = node + def length(self): + count = 0 + temp = self.head + while temp: + count += 1 + temp = temp.next + return count + def findKthBruteForce(self, K): + length = ll.length() + c = 0 + temp = ll.head + while (c<(length-K)): + temp = temp.next + c += 1 + return temp + def findKthHashing(self, K): + h = {} + c = 1 + temp = ll.head + while (temp): + h[c] = temp + temp = temp.next + c += 1 + return h[c-K] + def findKthEfficient(self, K): + v1 = ll.head + while (K and v1): + v1 = v1.next + K -= 1 + if K: + return None + + v2 = ll.head + while(v1): + v1 = v1.next + v2 = v2.next + return v2 + +node1 = Node(10) +node2 = Node(2) +node3 = Node(6) +node4 = Node(8) +node5 = Node(3) +node1.next = node2 +node2.next = node3 +node3.next = node4 +node4.next = node5 + +ll = LinkedList(node1) +kthNode = ll.findKthEfficient(20) +if kthNode: + print kthNode.data +else: + print "Check the list...seems K is greater than n" diff --git a/src/chapter11searching/MajorityElement2.py b/src/chapter11searching/MajorityElement2.py new file mode 100644 index 0000000..71cd53b --- /dev/null +++ b/src/chapter11searching/MajorityElement2.py @@ -0,0 +1,68 @@ +# Copyright (c) Oct 22, 2018 CareerMonk Publications and others. +# E-Mail : info@careermonk.com +# Creation Date : 2014-01-10 06:15:46 +# Last modification : 2008-10-31 +# by : Narasimha Karumanchi +# Book Title : Data Structures And Algorithmic Thinking With Python +# Warranty : This software is provided "as is" without any +# warranty; without even the implied warranty of +# merchantability or fitness for a particular purpose. + +def majority1(A): + n = len(A) + for element in A: + count = 0 + for e in A: + if (element == e): + count += 1 + if (count > n//2): + return element +def majority2(A): + A.sort() + max_count = 1 + majority_element = A[0] + count = 1 + element = A[0] + for i in range(1, len(A)): + if A[i] == element: + count += 1 + else: + if count > max_count: + max_count = count + majority_element = element + count = 1 + element = A[i] +def majority3(A): + A.sort() + max_count = 1 + for i in range(len(A)-1): + if A[i] == A[i+1]: + max_count += 1 + else: + max_count = 1 + if max_count > len(A)//2: + return A[i], max_count + +def majority4(A): + A.sort() + n = len(A) + return A[n//2] + +def majority5(A): + count = 0 + element = -1 + n = len(A) + for i in range(0, n - 1): + if(count == 0): + element = A[i] + count = 1 + elif(element == A[i]): + count += 1 + else: + count -= 1 + return element, count + +print majority5([1,2,3]) +#print majority5([3,2,1,3,1,3,3,3,4,4,4,4]) +#print majority5([3,2,1,3,1,3,3,3]) +#print majority5([3,2,3,3,1,3,3,3,4,4,4,4,4]) diff --git a/src/chapter11searching/TwoElementsWithSumKEfficientWithSorting.py b/src/chapter11searching/TwoElementsWithSumKEfficientWithSorting.py index c684a87..3a98cb9 100644 --- a/src/chapter11searching/TwoElementsWithSumKEfficientWithSorting.py +++ b/src/chapter11searching/TwoElementsWithSumKEfficientWithSorting.py @@ -8,7 +8,7 @@ # warranty; without even the implied warranty of # merchantability or fitness for a particular purpose. -def twoElementsWithSumKBruteForce(A, K): +def pair_sum_k_sorting(A, K): left = 0 right = len(A) - 1; while(left < right): @@ -22,4 +22,4 @@ def twoElementsWithSumKBruteForce(A, K): A = [1, 4, 45, 6, 10, -8] A.sort() -print twoElementsWithSumKBruteForce(A, 11) +print pair_sum_k_sorting(A, 11) diff --git a/src/chapter11searching/checkingDuplicates.py b/src/chapter11searching/checkingDuplicates.py new file mode 100644 index 0000000..3629499 --- /dev/null +++ b/src/chapter11searching/checkingDuplicates.py @@ -0,0 +1,89 @@ +# Copyright (c) Oct 22, 2018 CareerMonk Publications and others. +# E-Mail : info@careermonk.com +# Creation Date : 2014-01-10 06:15:46 +# Last modification : 2008-10-31 +# by : Narasimha Karumanchi +# Book Title : Data Structures And Algorithmic Thinking With Python +# Warranty : This software is provided "as is" without any +# warranty; without even the implied warranty of +# merchantability or fitness for a particular purpose. + +from collections import defaultdict +##Explain the logic +def checkDuplicates(A): + c = 0 + # If array length is 0 or not valid + if (len(A)==0): + return False + for i in range(len(A)): + for j in range(i+1, len(A)): + c += 1 + if (A[i] == A[j]): + print c + return True + print c + return False + +def checkDuplicates2(A): + c = 0 + # If array length is 0 or not valid + if (len(A)==0): + return False + for i in range(len(A)): + for j in range(0, len(A)): + c += 1 + if (i ==j): + continue + if (A[i] == A[j]): + print c + return True + print c + return False + +def checkDuplicates3(A): + c = 0 + # If array length is 0 or not valid + if (len(A)==0): + return False + + # Sorting the array elements + A.sort() + for i in range(len(A)): + c += 1 + if (A[i] == A[i+1]): + print c + return True + print c + return False + +def checkDuplicates4(A): + h = defaultdict(int) # default value of int is 0 + for element in A: + if (h[element] == 1): + print h.items() + return True + else: + h[element] = 1 + return False + +def checkDuplicates5(A): + # Error checks + minimum = min(A) + maximum = max(A) + if minimum < 0 or maximum >= len(A): + print("Not a avalid input") + return False + for i in range(len(A)): + if(A[abs(A[i])] < 0): + return True + else: + A[abs(A[i])] = -A[abs(A[i])] + + print("No duplicates in given array.") + return False + +#print checkDuplicates5([1,2,3,4,5,6,7,6]) +#print checkDuplicates5([0,1,2,3,4,5,6]) +#print checkDuplicates5([3,2,1,2,2,3]) +print checkDuplicates5([3,2,1,2,2,-3]) + diff --git a/src/chapter11searching/findDeletedElement.py b/src/chapter11searching/findDeletedElement.py new file mode 100644 index 0000000..39f8925 --- /dev/null +++ b/src/chapter11searching/findDeletedElement.py @@ -0,0 +1,80 @@ +# Copyright (c) Oct 22, 2018 CareerMonk Publications and others. +# E-Mail : info@careermonk.com +# Creation Date : 2014-01-10 06:15:46 +# Last modification : 2008-10-31 +# by : Narasimha Karumanchi +# Book Title : Data Structures And Algorithmic Thinking With Python +# Warranty : This software is provided "as is" without any +# warranty; without even the implied warranty of +# merchantability or fitness for a particular purpose. + +from collections import defaultdict +import random +import sys + +def findDeletedElement1(A, B): + for i in A: + counter = 0 + for k in A: + if (i == k): + counter += 1 + for j in B: + if (i == j): + counter -= 1 + if (counter != 0): + return i + return sys.minint + +def findDeletedElement2(A, B): + A.sort() + B.sort() + for i in range(len(A)-1): + if (A[i] != B[i]): + return A[i] + return A[len(A)-1] + +def findDeletedElement3(A, B): + A.sort() + B.sort() + for a, b in zip(A, B): + if (a != b): + return a + return A[len(A)-1] + +def findDeletedElement4(A, B): + h = defaultdict(int) # default value of int is 0 + for element in A: + h[element] += 1 + for element in B: + h[element] -= 1 + for element in A: + if (h[element] >= 1): + return element + +def findDeletedElement5(A, B): + return sum(A)-sum(B) + +def findDeletedElement6(A, B): + result = 0 + for i in A: + result = result ^ i + for i in B: + result = result ^ i + return result + +def findDeletedElement7(A, B): + result = 0 + for i, j in zip(A, B): + result = result ^ i ^ j + return result^A[len(A)-1] + +A=[3,6,8,4,5,2,2,3] +print "Original A-->", A +random.shuffle(A) +print "A after shuffle-->", A +B=A[1:] +print "Original B-->", B +random.shuffle(B) +print "B after shuffle-->", B +#print findDeletedElement6(A, B) +print findDeletedElement7(A, B) diff --git a/src/chapter11searching/finding_all_peaks_with_linear_search.py b/src/chapter11searching/finding_all_peaks_with_linear_search.py new file mode 100644 index 0000000..61c15d7 --- /dev/null +++ b/src/chapter11searching/finding_all_peaks_with_linear_search.py @@ -0,0 +1,16 @@ +def find_peaks(A): + peak = A[0] + for i in range(1, len(A)-2): + prev = A[i-1] + curr = A[i] + next = A[i+1] + if curr > prev and curr > next: + index = i + peak = curr + print peak + if A[len(A)-1] > A[len(A)-2]: + print A[len(A)-1] + +A = [35, 5, 20, 2, 40, 25, 80, 25, 15, 40] +print A, "\n" +find_peaks(A) diff --git a/src/chapter11searching/finding_highest_peak_with_linear_search.py b/src/chapter11searching/finding_highest_peak_with_linear_search.py new file mode 100644 index 0000000..112b2d6 --- /dev/null +++ b/src/chapter11searching/finding_highest_peak_with_linear_search.py @@ -0,0 +1,17 @@ +def find_peak(A): + peak = A[0] + for i in range(1, len(A)-2): + prev = A[i-1] + curr = A[i] + next = A[i+1] + if curr > prev and curr > next: + index = i + peak = curr + + if len(A)-1 > peak: + return A[len(A)-1] + + return A[index] + +A = [35, 5, 20, 2, 40, 25, 80, 25, 15, 40] +print A, "\n", find_peak(A) diff --git a/src/chapter11searching/finding_peak_with_binary_search.py b/src/chapter11searching/finding_peak_with_binary_search.py new file mode 100644 index 0000000..f633406 --- /dev/null +++ b/src/chapter11searching/finding_peak_with_binary_search.py @@ -0,0 +1,19 @@ +def find_peak(A): + if not A: + return -1 + + l, r = 0, len(A) - 1 + while l + 1 < r: + mid = l + (r - l) / 2 + if A[mid] < A[mid - 1]: + r = mid + elif A[mid] < A[mid + 1]: + l = mid + else: + return mid + mid = l if A[l] > A[r] else r + return mid + +A = [35, 5, 20, 2, 40, 25, 80, 25, 15, 40] +p = find_peak(A) +print A, "\n", A[p] diff --git a/src/chapter11searching/finding_single_peak_with_linear_search.py b/src/chapter11searching/finding_single_peak_with_linear_search.py new file mode 100644 index 0000000..0c87c86 --- /dev/null +++ b/src/chapter11searching/finding_single_peak_with_linear_search.py @@ -0,0 +1,18 @@ +def find_peak(A): + peak = A[0] + for i in range(1, len(A)-2): + prev = A[i-1] + curr = A[i] + next = A[i+1] + if curr > prev and curr > next: + index = i + peak = curr + return peak + + if len(A)-1 > peak: + return A[len(A)-1] + + return A[index] + +A = [35, 5, 20, 2, 40, 25, 80, 25, 15, 40] +print A, "\n", find_peak(A) diff --git a/src/chapter11searching/pivot.py b/src/chapter11searching/pivot.py new file mode 100644 index 0000000..64fb02e --- /dev/null +++ b/src/chapter11searching/pivot.py @@ -0,0 +1,26 @@ +# Copyright (c) Oct 22, 2018 CareerMonk Publications and others. +# E-Mail : info@careermonk.com +# Creation Date : 2014-01-10 06:15:46 +# Last modification : 2008-10-31 +# by : Narasimha Karumanchi +# Book Title : Data Structures And Algorithmic Thinking With Python +# Warranty : This software is provided "as is" without any +# warranty; without even the implied warranty of +# merchantability or fitness for a particular purpose. + +def findPivot1(A): + for i in range(len(A)): + leftSum = sum(A[:i]) + rightSum = sum(A[i+1:]) + if leftSum == rightSum: + return A[i] + +def findPivot2(A): + S= sum(A) + leftSum = 0 + for i in range(len(A)): + if leftSum == S-A[i]-leftSum: + return A[i] + leftSum += A[i] + +print findPivot2([12,6,9,3,5,2,1,9,10]) diff --git a/src/chapter11searching/planting.py b/src/chapter11searching/planting.py new file mode 100644 index 0000000..8fbb516 --- /dev/null +++ b/src/chapter11searching/planting.py @@ -0,0 +1,22 @@ +# Copyright (c) Oct 22, 2018 CareerMonk Publications and others. +# E-Mail : info@careermonk.com +# Creation Date : 2014-01-10 06:15:46 +# Last modification : 2008-10-31 +# by : Narasimha Karumanchi +# Book Title : Data Structures And Algorithmic Thinking With Python +# Warranty : This software is provided "as is" without any +# warranty; without even the implied warranty of +# merchantability or fitness for a particular purpose. + +def planting(A, K): + counter = 0 + for i in range(0,len(A)): + if (A[i] == 0 and (i == 0 or A[i-1] ==0) and ( i == len(A)-1 or A[i+1] == 0)): + A[i] = 1 + counter += 1 + if counter == K: + return True, A + return False + +print planting([1,0,0,0,1,0,0], 2) +print planting([1,0,0,0,1,0,0], 3) diff --git a/src/chapter11searching/singleUniqueNumber.py b/src/chapter11searching/singleUniqueNumber.py new file mode 100644 index 0000000..ea1e982 --- /dev/null +++ b/src/chapter11searching/singleUniqueNumber.py @@ -0,0 +1,20 @@ +# Copyright (c) Dec 22, 2014 CareerMonk Publications and others. +# E-Mail : info@careermonk.com +# Creation Date : 2014-01-10 06:15:46 +# Last modification : 2008-10-31 +# by : Narasimha Karumanchi +# Book Title : Data Structures And Algorithmic Thinking With Python +# Warranty : This software is provided "as is" without any +# warranty; without even the implied warranty of +# merchantability or fitness for a particular purpose. + +class Solution(object): + def singleNumber(self, A): + """ + :type A: List[int] + :rtype: int + """ + result = 0 + for n in A: + result ^= n + return result diff --git a/src/chapter11searching/twoElementsWithSumK.py b/src/chapter11searching/twoElementsWithSumK.py new file mode 100644 index 0000000..a7918a5 --- /dev/null +++ b/src/chapter11searching/twoElementsWithSumK.py @@ -0,0 +1,42 @@ +# Copyright (c) Oct 22, 2018 CareerMonk Publications and others. +# E-Mail : info@careermonk.com +# Creation Date : 2014-01-10 06:15:46 +# Last modification : 2008-10-31 +# by : Narasimha Karumanchi +# Book Title : Data Structures And Algorithmic Thinking With Python +# Warranty : This software is provided "as is" without any +# warranty; without even the implied warranty of +# merchantability or fitness for a particular purpose. +from collections import defaultdict +def twoElementsWithSumK1(A, K): + n = len(A) + for i in range(n): + for j in range(i + 1, n): + if(A[i] + A[j] == K): + print ("%d=%d+%d" %(K, A[i], A[j])) + +def twoElementsWithSumK2(A, K): + A.sort() + i = 0 + j = len(A)-1 + while(i<=j): + if(A[i] + A[j] == K): + print ("%d=%d+%d" %(K, A[i], A[j])) + i += 1 + elif(A[i] + A[j] > K): + j -= 1 + else: + i += 1 + +def twoElementsWithSumK3(A, K): + h = defaultdict(int) # default value of int is 0 + for element in A: + h[element] += 1 + if(h[K - element]): + if ((K - element) == element and h[element] == 1): + continue + else: + print ("%d=%d+%d" %(K, element, K - element)) + +A = [1,2,3,1,4,5,2,6,2,5,6] +print twoElementsWithSumK3(A, 10) diff --git a/src/chapter17greedyalgorithms/greedy_ascent.py b/src/chapter17greedyalgorithms/greedy_ascent.py new file mode 100644 index 0000000..1beaaef --- /dev/null +++ b/src/chapter17greedyalgorithms/greedy_ascent.py @@ -0,0 +1,39 @@ +import random +import pprint +import operator +def greedy_ascent(matrix): + j = len(matrix[0]) // 2 + i = len(matrix) // 2 + + while True: + left, right, up, bottom = 0, 0, 0, 0 + if j > 0: + left = matrix[i][j - 1] + if j < len(matrix[0]) - 1: + right = matrix[i][j + 1] + if i > 0: + up = matrix[i-1][j] + if i < len(matrix) - 1: + bottom = matrix[i+1][j] + if (left <= matrix[i][j] >= right) and (up <= matrix[i][j] >= bottom): + return (i, j, matrix[i][j]) + my_list = [left, up, right, bottom] + max_neighbor_index, max_neighbor_value = max(enumerate(my_list), key=operator.itemgetter(1)) + if max_neighbor_index == 0: + j = j - 1 + elif max_neighbor_index == 1: + i = i - 1 + elif max_neighbor_index == 2: + j = j + 1 + else: + i = i + 1 + + +def generate_2d_array(n=7, m=7, lower=0, upper=9): + return [[random.randint(lower, upper) for _ in range(m)] for _ in range(n)] + +if __name__ == '__main__': + matrix = generate_2d_array(upper=9) + pprint.pprint(matrix) + x = greedy_ascent(matrix) + pprint.pprint(x) diff --git a/src/chapter18divideandconquer/ExponentialWithDivideAndConquer.py b/src/chapter18divideandconquer/ExponentialWithDivideAndConquer.py index 10b392b..ab87789 100644 --- a/src/chapter18divideandconquer/ExponentialWithDivideAndConquer.py +++ b/src/chapter18divideandconquer/ExponentialWithDivideAndConquer.py @@ -8,15 +8,34 @@ # warranty; without even the implied warranty of # merchantability or fitness for a particular purpose. -def power(k, n): - if n == 0: return 1 - x = power(k, math.floor(n / 2)) - if n % 2 == 0: return pow(x, 2) - else: return k * pow(x, 2) +import math +def power_brute_force(k, n): + """linear power algorithm""" + x = k + for i in range(1, n): + x *= k + return x + +print power_brute_force(2, 3) + -def powerBruteForce(k, n): - """linear power algorithm""" - x = k; - for i in range(1, n): - x *= k - return x + +def power_divide_and_conquer(k, n): +"""Divide and Conquer power algorithm""" + + # base case + if n == 0: + return 1 + + # base case + if k == 0: + return 0 + + x = power_divide_and_conquer(a, math.floor(n/2)) + if n % 2 == 0: + return x * x + else: + return k * x * x + +print power_divide_and_conquer(2, 4) + diff --git a/src/chapter18divideandconquer/SkyLinesBruteForce.py b/src/chapter18divideandconquer/SkyLinesBruteForce.py new file mode 100644 index 0000000..b0f117e --- /dev/null +++ b/src/chapter18divideandconquer/SkyLinesBruteForce.py @@ -0,0 +1,39 @@ +# Copyright (c) Feb 22, 2016 CareerMonk Publications and others. +# E-Mail : info@careermonk.com +# Creation Date : 2016-02-22 06:15:46 +# Last modification : 2008-10-31 +# by : Narasimha Karumanchi +# Book Title : Data Structures And Algorithmic Thinking With Python +# Warranty : This software is provided "as is" without any +# warranty; without even the implied warranty of +# merchantability or fitness for a particular purpose. + + +def SkyLineBruteForce(): + auxHeights = [0]*1000 + rightMostBuildingRi=0 + p = raw_input("Enter three values: ") # raw_input() function + inputValues = p.split() + inputCount = len(inputValues) + while inputCount==3: + left = int(inputValues[0]) + h = int(inputValues[1]) + right = int(inputValues[2]) + for i in range(left,right-1): + if(auxHeights[i] rightSkyline[j][0]: + h2 = rightSkyline[j][1] + if maxH != max(h1, h2): + result.append([rightSkyline[j][0], max(h1, h2)]) + maxH = max(h1, h2) + j += 1 + else: + h1 = leftSkyline[i][1] + h2 = rightSkyline[j][1] + if maxH != max(h1, h2): + result.append([rightSkyline[j][0], max(h1, h2)]) + maxH = max(h1, h2) + i += 1 + j += 1 + while i < len(leftSkyline): + result.append(leftSkyline[i]) + i += 1 + while j < len(rightSkyline): + result.append(rightSkyline[j]) + j += 1 + return result diff --git a/src/chapter18divideandconquer/find_peak-2d.py b/src/chapter18divideandconquer/find_peak-2d.py new file mode 100644 index 0000000..46023d6 --- /dev/null +++ b/src/chapter18divideandconquer/find_peak-2d.py @@ -0,0 +1,40 @@ +import random +import pprint + +def peak_find_2d(matrix): + j = len(matrix[0]) // 2 + + # maxvalue is the global maximum in column j + # rowmax is the row index of the maxvalue + maxvalue, rowmax = -1, -1 + for row in range(len(matrix)): + if maxvalue <= matrix[row][j]: + maxvalue = matrix[row][j] + rowmax = row + + left, right = 0, 0 + if j > 0: + left = matrix[rowmax][j - 1] + if j < len(matrix[0]) - 1: + right = matrix[rowmax][j + 1] + if left <= maxvalue >= right: + return (rowmax, j, maxvalue) + if left > maxvalue: + half = [] + for row in matrix: + half.append(row[:j + 1]) + return peak_find_2d(half) + if right > maxvalue: + half = [] + for row in matrix: + half.append(row[j:]) + return peak_find_2d(half) + +def generate_2d_array(n=7, m=7, lower=0, upper=9): + return [[random.randint(lower, upper) for _ in range(m)] for _ in range(n)] + +if __name__ == '__main__': + matrix = generate_2d_array(upper=9) + pprint.pprint(matrix) + x = peak_find_2d(matrix) + pprint.pprint(x) diff --git a/src/chapter18divideandconquer/finding_all_peaks_with_linear_search.py b/src/chapter18divideandconquer/finding_all_peaks_with_linear_search.py new file mode 100644 index 0000000..61c15d7 --- /dev/null +++ b/src/chapter18divideandconquer/finding_all_peaks_with_linear_search.py @@ -0,0 +1,16 @@ +def find_peaks(A): + peak = A[0] + for i in range(1, len(A)-2): + prev = A[i-1] + curr = A[i] + next = A[i+1] + if curr > prev and curr > next: + index = i + peak = curr + print peak + if A[len(A)-1] > A[len(A)-2]: + print A[len(A)-1] + +A = [35, 5, 20, 2, 40, 25, 80, 25, 15, 40] +print A, "\n" +find_peaks(A) diff --git a/src/chapter18divideandconquer/finding_highest_peak_with_linear_search.py b/src/chapter18divideandconquer/finding_highest_peak_with_linear_search.py new file mode 100644 index 0000000..60b9b2a --- /dev/null +++ b/src/chapter18divideandconquer/finding_highest_peak_with_linear_search.py @@ -0,0 +1,21 @@ +def find_peak(A): + max_peak_value = max_peak_index = -1 + peak = A[0] + index = 0 + for i in range(1, len(A)-1): + prev = A[i-1] + curr = A[i] + next = A[i+1] + if curr > prev and curr > next: + index = i + peak = curr + if peak > max_peak_value: + max_peak_value, max_peak_index = peak, index + + if A[len(A)-1] > peak: + return A[len(A)-1], len(A)-1 + + return max_peak_value, max_peak_index + +A = [35, 5, 20, 2, 90, 25, 80, 25, 115, 40] +print A, "\n", find_peak(A) diff --git a/src/chapter18divideandconquer/finding_peak_with_binary_search.py b/src/chapter18divideandconquer/finding_peak_with_binary_search.py new file mode 100644 index 0000000..7268303 --- /dev/null +++ b/src/chapter18divideandconquer/finding_peak_with_binary_search.py @@ -0,0 +1,19 @@ +def find_peak(A): + if not A: + return -1 + + left, right = 0, len(A) - 1 + while left + 1 < right: + mid = left + (right - left) / 2 + if A[mid] < A[mid - 1]: + right = mid + elif A[mid] < A[mid + 1]: + left = mid + else: + return mid + mid = left if A[left] > A[right] else right + return mid + +A = [35, 5, 20, 2, 40, 25, 80, 25, 15, 40] +peak = find_peak(A) +print A, "\n", A[peak] diff --git a/src/chapter18divideandconquer/finding_single_peak_with_linear_search.py b/src/chapter18divideandconquer/finding_single_peak_with_linear_search.py new file mode 100644 index 0000000..0c87c86 --- /dev/null +++ b/src/chapter18divideandconquer/finding_single_peak_with_linear_search.py @@ -0,0 +1,18 @@ +def find_peak(A): + peak = A[0] + for i in range(1, len(A)-2): + prev = A[i-1] + curr = A[i] + next = A[i+1] + if curr > prev and curr > next: + index = i + peak = curr + return peak + + if len(A)-1 > peak: + return A[len(A)-1] + + return A[index] + +A = [35, 5, 20, 2, 40, 25, 80, 25, 15, 40] +print A, "\n", find_peak(A) diff --git a/src/chapter18divideandconquer/greedy_ascent.py b/src/chapter18divideandconquer/greedy_ascent.py new file mode 100644 index 0000000..1beaaef --- /dev/null +++ b/src/chapter18divideandconquer/greedy_ascent.py @@ -0,0 +1,39 @@ +import random +import pprint +import operator +def greedy_ascent(matrix): + j = len(matrix[0]) // 2 + i = len(matrix) // 2 + + while True: + left, right, up, bottom = 0, 0, 0, 0 + if j > 0: + left = matrix[i][j - 1] + if j < len(matrix[0]) - 1: + right = matrix[i][j + 1] + if i > 0: + up = matrix[i-1][j] + if i < len(matrix) - 1: + bottom = matrix[i+1][j] + if (left <= matrix[i][j] >= right) and (up <= matrix[i][j] >= bottom): + return (i, j, matrix[i][j]) + my_list = [left, up, right, bottom] + max_neighbor_index, max_neighbor_value = max(enumerate(my_list), key=operator.itemgetter(1)) + if max_neighbor_index == 0: + j = j - 1 + elif max_neighbor_index == 1: + i = i - 1 + elif max_neighbor_index == 2: + j = j + 1 + else: + i = i + 1 + + +def generate_2d_array(n=7, m=7, lower=0, upper=9): + return [[random.randint(lower, upper) for _ in range(m)] for _ in range(n)] + +if __name__ == '__main__': + matrix = generate_2d_array(upper=9) + pprint.pprint(matrix) + x = greedy_ascent(matrix) + pprint.pprint(x) diff --git a/src/chapter19dynamicprogramming/Count_Apples_with_3ways_of_reaching.py b/src/chapter19dynamicprogramming/Count_Apples_with_3ways_of_reaching.py new file mode 100644 index 0000000..1ee12ed --- /dev/null +++ b/src/chapter19dynamicprogramming/Count_Apples_with_3ways_of_reaching.py @@ -0,0 +1,34 @@ +def find_maximum_apples_count_3ways_of_reaching(Apples, n, m): + S =[[0 for x in range(m)] for x in range(n)] + + # Initialize position S[0][0]. + # We cannot collect any apples other than Apples[0][0] + S[0][0] = Apples[0][0] + + # Initialize the first row + for j in range(1, m): + S[0][j] = Apples[0][j] + S[0][j-1] + + # Initialize the first column + for i in range(1, n): + S[i][0] = Apples[i][0] + S[i-1][0] + + for i in range(1, n): + for j in range(1, m): + previous_column = S[i][j-1] + previous_row = S[i-1][j] + previous_diagonal = S[i-1][j-1] + + if (previous_column >= previous_row) and (previous_column >= previous_diagonal): + largest = previous_column + elif (previous_row >= previous_column) and (previous_row >= previous_diagonal): + largest = previous_row + else: + largest = previous_diagonal + + S[i][j] = Apples[i][j] + largest + + return S[n-1][m-1] + +Apples = [ [1, 2, 4, 7], [2, 1, 6, 1], [12, 5, 9, 19], [4, 29, 50, 60] ] +print find_maximum_apples_count_3ways_of_reaching(Apples, len(Apples), len(Apples[0])) diff --git a/src/chapter19dynamicprogramming/FindApplesCount.py b/src/chapter19dynamicprogramming/FindApplesCount.py index 64459e3..ca9320f 100644 --- a/src/chapter19dynamicprogramming/FindApplesCount.py +++ b/src/chapter19dynamicprogramming/FindApplesCount.py @@ -8,25 +8,32 @@ # warranty; without even the implied warranty of # merchantability or fitness for a particular purpose. -def FindApplesCount(Apples, n, m): - S = [[0 for x in range(m)] for x in range(n)] +def find_maximum_apples_count(Apples, n, m): + S =[[0 for x in range(m)] for x in range(n)] + + # Initialize position S[0][0]. + # We cannot collect any apples otherthan Apples[0][0] S[0][0] = Apples[0][0] - for i in range(1, n): - S[i][0] = Apples[i][0] + S[i - 1][0] - + + # Initialize the first row for j in range(1, m): - S[0][j] = Apples[0][j] + S[0][j - 1] + S[0][j] = Apples[0][j] + S[0][j-1] + + # Initialize the first column + for i in range(1, n): + S[i][0] = Apples[i][0] + S[i-1][0] for i in range(1, n): for j in range(1, m): - r1 = S[i][j - 1] - r2 = S[i - 1][j] - if (r1 > r2): - S[i][j] = Apples[i][j] + r1 - else: - S[i][j] = Apples[i][j] + r2 + previous_column = S[i][j-1] + previous_row = S[i-1][j] - return S[n - 1][m - 1] + if (previous_column > previous_row): + S[i][j] = Apples[i][j] + previous_column + else: + S[i][j] = Apples[i][j ]+ previous_row + + return S[n-1][m-1] -Apples = [ [5, 24], [15, 25], [27, 40], [50, 60] ] -print FindApplesCount(Apples, 4, 2) +Apples = [ [1, 2, 4, 7], [2, 1, 6, 1], [12, 5, 9, 19], [4, 29, 50, 60] ] +print find_maximum_apples_count(Apples, len(Apples), len(Apples[0])) diff --git a/src/chapter19dynamicprogramming/longest_common_subsequence_recursive.py b/src/chapter19dynamicprogramming/longest_common_subsequence_recursive.py new file mode 100644 index 0000000..4e1709c --- /dev/null +++ b/src/chapter19dynamicprogramming/longest_common_subsequence_recursive.py @@ -0,0 +1,23 @@ +def LCS(X, Y): + if not X or not Y: + return "" + x, m, y, n = X[0], X[1:], Y[0], Y[1:] + if x == y: + return x+LCS(m, n) + else: + # Use key=len to select the maximum string in a list efficiently + return max(LCS (X, n), LCS(m, Y), key=len) + +print "Longest common subsequence: ", LCS('ABCBDAB', 'BDCABA') + +def LCS_length(X, Y): + if not X or not Y: + return 0 + x, m, y, n = X[0], X[1:], Y[0], Y[1:] + if x == y: + return 1+LCS_length(m, n) + else: + # Use key=len to select the maximum string in a list efficiently + return max(LCS_length(X, n), LCS_length(m, Y)) + +print "Longest common subsequence length: ", LCS_length('ABCBDAB', 'BDCABA') diff --git a/src/chapter19dynamicprogramming/tribonacci_series.py b/src/chapter19dynamicprogramming/tribonacci_series.py new file mode 100644 index 0000000..d6534a4 --- /dev/null +++ b/src/chapter19dynamicprogramming/tribonacci_series.py @@ -0,0 +1,27 @@ +def trib_recursive(n): + if n == 0: return 0 + elif n == 1: return 1 + elif n == 2: return 2 + else: return trib_recursive(n-1)+ trib_recursive(n-2) + trib_recursive(n-3) + +print (trib_recursive(10)) + + +def trib_dep(n): + tribTable = [0 for x in range(n+1)] + tribTable[0] = 0 + tribTable[1] = 1 + tribTable[2] = 2 + for i in range(3, n+1): + tribTable[i] = tribTable[i-1] + tribTable[i-2] + tribTable[i-3] + return tribTable[n] + +print(trib_dep(10)) + +def trib_iterative(n): + a, b, c = 0, 1, 2 + for i in range(n): + a, b, c = b, c, a + b + c + return a + +print(trib_iterative(10)) diff --git a/src/chapter21miscconcepts/CamptureRegions.py b/src/chapter21miscconcepts/CamptureRegions.py index c85490f..c89a706 100644 --- a/src/chapter21miscconcepts/CamptureRegions.py +++ b/src/chapter21miscconcepts/CamptureRegions.py @@ -45,6 +45,6 @@ def mark(self, board, row, col): if row < len(board) - 1: stack.append((row + 1) * nCols + col) if col > 0: - stack.append(row * nCols + col - 1) + stack.append(row * nCols + col - 1) if col < nCols - 1: stack.append(row * nCols + col + 1) diff --git a/src/chapter21miscconcepts/CountNumberofSetbitsin1toN.py b/src/chapter21miscconcepts/CountNumberofSetbitsin1toN.py new file mode 100644 index 0000000..90cbc13 --- /dev/null +++ b/src/chapter21miscconcepts/CountNumberofSetbitsin1toN.py @@ -0,0 +1,29 @@ +# Copyright (c) Dec 22, 2014 CareerMonk Publications and others. +# E-Mail : info@careermonk.com +# Creation Date : 2014-01-10 06:15:46 +# Last modification : 2008-10-31 +# by : Narasimha Karumanchi +# Book Title : Data Structures And Algorithmic Thinking With Python +# Warranty : This software is provided "as is" without any +# warranty; without even the implied warranty of +# merchantability or fitness for a particular purpose. + + + +def counting_number_of_ones_in_1_to_N(n): + count = 0 + for i in range(1, n+1): + j = i; + while(j): + count += 1 + j &= j - 1 + print count + +n = 2 +counting_number_of_ones_in_1_to_N(n) +n = 5 +counting_number_of_ones_in_1_to_N(n) +n = 7 +counting_number_of_ones_in_1_to_N(n) +n = 8 +counting_number_of_ones_in_1_to_N(n) diff --git a/src/chapter21miscconcepts/MatrixRotation.py b/src/chapter21miscconcepts/MatrixRotation.py new file mode 100644 index 0000000..71a11cb --- /dev/null +++ b/src/chapter21miscconcepts/MatrixRotation.py @@ -0,0 +1,44 @@ +# Copyright (c) Dec 22, 2014 CareerMonk Publications and others. +# E-Mail : info@careermonk.com +# Creation Date : 2014-01-10 06:15:46 +# Last modification : 2008-10-31 +# by : Narasimha Karumanchi +# Book Title : Data Structures And Algorithmic Thinking With Python +# Warranty : This software is provided "as is" without any +# warranty; without even the implied warranty of +# merchantability or fitness for a particular purpose. + +#Printing the matrix +def print_matrix(matrix): + for row in matrix: + print row + print + +#rotate the matrix by 90 degrees (clockwise) in place +def rotate_90_degrees(matrix): + layers = len(matrix) / 2 + length = len(matrix) - 1 + + for layer in range(layers): #for each layer + for i in range(layer, length - layer): # loop through the elements we need to change at each layer + temp = matrix[layer][i] #save the top element, it takes just one variable as extra memory + #Left -> Top + matrix[layer][i] = matrix[length - i][layer] + #Bottom -> left + matrix[length - i][layer] = matrix[length - layer][length - i] + #Right -> bottom + matrix[length - layer][length - i] = matrix[i][length - layer] + #Top -> Right + matrix[i][length - layer] = temp + +matrix =[ + [1, 2, 3, 4 ], + [5, 6, 7, 8 ], + [9, 10, 11, 12 ], + [13, 14, 15, 16 ] + ] +print "Input matrix:\n" +print_matrix(matrix) +rotate_90_degrees(matrix) +print "Rotated matrix by 90 degrees:\n" +print_matrix(matrix) diff --git a/src/chapter21miscconcepts/MatrixSortedFind.py b/src/chapter21miscconcepts/MatrixSortedFind.py index fd78d88..25b88c5 100644 --- a/src/chapter21miscconcepts/MatrixSortedFind.py +++ b/src/chapter21miscconcepts/MatrixSortedFind.py @@ -8,7 +8,7 @@ # warranty; without even the implied warranty of # merchantability or fitness for a particular purpose. -def matrixFind(matrix, value): +def matrix_find(matrix, value): m = len(matrix) if m == 0: return 0 diff --git a/src/chapter21miscconcepts/NumberOfOccurences.py b/src/chapter21miscconcepts/NumberOfOccurences.py index be3a659..88c123b 100644 --- a/src/chapter21miscconcepts/NumberOfOccurences.py +++ b/src/chapter21miscconcepts/NumberOfOccurences.py @@ -8,12 +8,12 @@ # warranty; without even the implied warranty of # merchantability or fitness for a particular purpose. -def LinearSearchCOunt(A, data): +def linear_search_count(A, data): count = 0 - for i in range (0, len(A)): + for i in range (0, len(A)): if(A[i] == data): - count += 1 + count += 1 return count A = [7, 3, 6, 3, 3, 6, 7 ] -print LinearSearchCOunt(A, 7) +print linear_search_count(A, 7) diff --git a/src/chapter21miscconcepts/NumberOfOneBits.py b/src/chapter21miscconcepts/NumberOfOneBits.py index f23ecac..fff94e4 100644 --- a/src/chapter21miscconcepts/NumberOfOneBits.py +++ b/src/chapter21miscconcepts/NumberOfOneBits.py @@ -8,30 +8,30 @@ # warranty; without even the implied warranty of # merchantability or fitness for a particular purpose. -def numberOfOnes1(n): +def number_of_ones1(n): count = 0 while(n): - count += n & 1 - n >>= 1 + count += n & 1 + n >>= 1 print count -def numberOfOnes2(n): +def number_of_ones2(n): count = 0 while(n): - if(n % 2 == 1): - count += 1 - n = n / 2 + if(n % 2 == 1): + count += 1 + n = n / 2 print count -def numberOfOnes3(n): +def number_of_ones3(n): count = 0 while(n): count += 1 n &= n - 1 print count -def numberOfOnes4(n): +def number_of_ones4(n): Table = [0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4] count = 0 while (n): @@ -42,7 +42,7 @@ def numberOfOnes4(n): n = 11 -numberOfOnes1(n) -numberOfOnes2(n) -numberOfOnes3(n) -numberOfOnes4(n) +number_of_ones1(n) +number_of_ones2(n) +number_of_ones3(n) +number_of_ones4(n) diff --git a/src/chapter21miscconcepts/NumberOfTrailingZerosOfFactorialNumber.py b/src/chapter21miscconcepts/NumberOfTrailingZerosOfFactorialNumber.py index a2ebaa5..f88aa79 100644 --- a/src/chapter21miscconcepts/NumberOfTrailingZerosOfFactorialNumber.py +++ b/src/chapter21miscconcepts/NumberOfTrailingZerosOfFactorialNumber.py @@ -8,7 +8,7 @@ # warranty; without even the implied warranty of # merchantability or fitness for a particular purpose. -def numberOfTrailingZerosOfFactorialNumber(n): +def number_of_trailing_zeros_of_factorial_number(n): count = 0 if(n < 0): return -1 @@ -18,4 +18,4 @@ def numberOfTrailingZerosOfFactorialNumber(n): i *= 5 return count -print numberOfTrailingZerosOfFactorialNumber(100) +print number_of_trailing_zeros_of_factorial_number(100) diff --git a/src/chapter21miscconcepts/ReverseinBinary.py b/src/chapter21miscconcepts/ReverseinBinary.py index ba05af1..d8b9784 100644 --- a/src/chapter21miscconcepts/ReverseinBinary.py +++ b/src/chapter21miscconcepts/ReverseinBinary.py @@ -8,7 +8,7 @@ # warranty; without even the implied warranty of # merchantability or fitness for a particular purpose. -def reverseNumber(n): +def reverse_number(n): nReverse = n s = n.bit_length() while(n): @@ -21,4 +21,4 @@ def reverseNumber(n): n = 4 print n -reverseNumber(n) +reverse_number(n) diff --git a/src/chapter21miscconcepts/ShuffleArray.py b/src/chapter21miscconcepts/ShuffleArray.py index 17bee68..6162b5a 100644 --- a/src/chapter21miscconcepts/ShuffleArray.py +++ b/src/chapter21miscconcepts/ShuffleArray.py @@ -9,7 +9,7 @@ # merchantability or fitness for a particular purpose. import random -def shuffleArray(A): +def shuffle_array(A): n = len(A) i = n - 1 while i > 0: @@ -18,5 +18,5 @@ def shuffleArray(A): i -= 1 A = [1, 3, 5, 6, 2, 4, 6, 8] -shuffleArray(A) +shuffle_array(A) print A diff --git a/src/chapter21miscconcepts/SprialIterativePrint.py b/src/chapter21miscconcepts/SprialIterativePrint.py index ed63cef..65ab819 100644 --- a/src/chapter21miscconcepts/SprialIterativePrint.py +++ b/src/chapter21miscconcepts/SprialIterativePrint.py @@ -8,7 +8,7 @@ # warranty; without even the implied warranty of # merchantability or fitness for a particular purpose. -def spiralIterative(n): +def spiral_iterative(n): dx, dy = 1, 0 # Starting increments x, y = 0, 0 # Starting location matrix = [[None] * n for j in range(n)] @@ -22,11 +22,11 @@ def spiralIterative(n): x, y = x + dx, y + dy return matrix -def printSpiral(matrix): +def print_spiral(matrix): n = range(len(matrix)) for y in n: for x in n: print "%2i" % matrix[x][y], print - printSpiral(spiralIterative(5)) +print_spiral(spiral_iterative(5))