Various self-contained Python scripts.

  • # File: TestBinaryTree.py

    # Description: Creates binary trees and runs several tests on them.

    import sys

    class Node (object):

    def __init__(self, data = None, level = 1):

    self.data = data

    self.left = None

    self.right = None

    self.level = level

    def __str__(self):

    return ("DATA:" + str(self.data), "LEVEL:", self.level)

    class Tree (object):

    def __init__(self, data_list):

    self.root = None

    # Insert each item in the data list into the tree

    for i in data_list:

    self.insert(i)

    def insert(self, data):

    # Make the data the root if the root is empty

    if (self.root == None):

    self.root = Node(data)

    return

    # Find a place for this piece of data

    level = 1

    current = self.root

    while (current != None):

    level += 1

    # If the data is less than the current node, go left

    if (data < current.data):

    #print(data, "is less than", current.data)

    if (current.left == None):

    #print("Found a spot to the left of", current.data)

    current.left = Node(data, level)

    return

    current = current.left

    # If the data is greater than or equal to the current node,

    # go right

    elif (data >= current.data):

    #print(data, "is greater than or equal to", current.data)

    if (current.right == None):

    #print("Found a spot to the right of", current.data)

    current.right = Node(data, level)

    return

    current = current.right

    # Returns true if two binary trees are similar

    def is_similar (self, pNode):

    # First check if they have the same height

    if (self.get_height() != pNode.get_height()):

    return False

    # Check if each level has the same values

    for level in range(1, self.get_height() + 1):

    self_nodes = self.get_level(level)

    other_nodes = pNode.get_level(level)

    if (self_nodes != other_nodes):

    return False

    return True

    # Prints out all nodes at the given level

    def print_level (self, level):

    # Return a blank string if the level doesn't exist

    if (level < 1) or (level > self.get_height()):

    return ''

    tree_queue = [self.root]

    # Using a Breadth First Search, print all the nodes with a given

    # level value

    while(len(tree_queue) != 0):

    current = tree_queue.pop()

    if (current != None):

    if (current.level == level):

    print(current.data)

    tree_queue.append(current.left)

    tree_queue.append(current.right)

    # Returns a list of all nodes at the given level. Same idea as

    # print_level() except you are adding the nodes into a list

    def get_level (self, level):

    # Return a blank string if the level doesn't exist

    if (level < 1) or (level > self.get_height()):

    return ''

    tree_queue = [self.root]

    nodes = []

    while(len(tree_queue) != 0):

    current = tree_queue.pop()

    if (current != None):

    if (current.level == level):

    nodes.insert(0, current.data)

    tree_queue.append(current.left)

    tree_queue.append(current.right)

    return nodes

    # Returns the height of the tree

    def get_height (self):

    # Check if the tree is empty

    if (self.root == None):

    return -1

    height = 0

    tree_stack = [self.root]

    # Using a Depth First Search, find the node with the largest

    # height.

    while(len(tree_stack) != 0):

    current = tree_stack.pop(0)

    if (current != None):

    #print(current.data, "is at level", current.level)

    if (current.level > height):

    height = current.level

    tree_stack.insert(0, current.right)

    tree_stack.insert(0, current.left)

    return height

    # Returns the number of nodes in the left subtree and

    # the number of nodes in the right subtree and the root

    def num_nodes (self):

    # Check if the tree is empty

    if (self.root == None):

    return 0

    left_count = self.count_nodes(self.root.left)

    right_count = self.count_nodes(self.root.right)

    print("Root has 1 node")

    print("Left subtree has", left_count, "and right subtree has", right_count)

    return (left_count + right_count + 1)

    # Helper function that counts the nodes starting from a given node

    def count_nodes(self, start):

    node_count = 0

    nodes_queue = [start]

    while(len(nodes_queue) != 0):

    current = nodes_queue.pop()

    if (current != None):

    node_count += 1

    nodes_queue.append(current.left)

    nodes_queue.append(current.right)

    return node_count

    def main():

    # Create three trees - two are the same and the third is different

    line = sys.stdin.readline()

    line = line.strip()

    line = line.split()

    tree1_input = list (map (int, line)) # converts elements into ints

    line = sys.stdin.readline()

    line = line.strip()

    line = line.split()

    tree2_input = list (map (int, line)) # converts elements into ints

    line = sys.stdin.readline()

    line = line.strip()

    line = line.split()

    tree3_input = list (map (int, line)) # converts elements into ints

    treeA = Tree(tree1_input)

    treeB = Tree(tree2_input)

    treeC = Tree(tree3_input)

    print()

    # Test your method is_similar()

    print("----- is_similar() -----")

    print("Tree A is similar to Tree B:", treeA.is_similar(treeB))

    print("Tree A is similar to Tree C:", treeA.is_similar(treeC))

    print("Tree B is similar to Tree C:", treeB.is_similar(treeC))

    print()

    # Print the various levels of two of the trees that are different

    print("----- print_level() -----")

    print("-- Tree A --")

    for i in range(1, treeA.get_height() + 1):

    print("Level " + str(i) + ": ")

    print(treeA.get_level(i))

    print()

    print("-- Tree C --")

    for i in range(1, treeC.get_height() + 1):

    print("Level " + str(i) + ": ")

    print(treeC.get_level(i))

    print()

    # Get the height of the two trees that are different

    print("----- get_height -----")

    print("Height of Tree A:", treeA.get_height() - 1)

    print("Height of Tree C:", treeC.get_height() - 1)

    print()

    # Get the total number of nodes a binary search tree

    print("----- num_nodes() -----")

    print("-- Tree A --")

    print("That makes", treeA.num_nodes(), "nodes total.")

    print()

    print("-- Tree C --")

    print("That makes", treeC.num_nodes(), "nodes total.")

    if __name__ == "__main__":

    main()

  • # File: RadixSort.py

    # Description: Performs a radix sort on a given list of letters and

    # numbers.

    import sys

    class Queue (object):

    def __init__ (self):

    self.queue = []

    # add an item to the end of the queue

    def enqueue (self, item):

    self.queue.append (item)

    # remove an item from the beginning of the queue

    def dequeue (self):

    return (self.queue.pop(0))

    # check if the queue if empty

    def is_empty (self):

    return (len(self.queue) == 0)

    # return the size of the queue

    def size (self):

    return (len(self.queue))

    # Input: a is a list of strings that have either lower case

    # letters or digits

    # Output: returns a sorted list of strings

    def radix_sort (a):

    # a list will store all of our queue objects

    queues = []

    big_queue = Queue()

    # find the length of the longest string. This will be how many passes

    # we will perform.

    num_passes = 0

    for item in a:

    if len(item) > num_passes:

    num_passes = len(item)

    #print("we will perform", num_passes, "passes")

    # populate the list with queues

    for i in range(37):

    queues.append(Queue())

    # enqueue items to the big queue

    for i in range(len(a)):

    while len(a[i]) < num_passes: #review this

    a[i] += '#'

    big_queue.enqueue(a[i])

    # sort items

    for i in range(1, num_passes + 1):

    for j in range(big_queue.size()):

    item = big_queue.dequeue()

    index = get_index(item, i)

    #print(item, "goes into index", index)

    queues[index].enqueue(item)

    #print_queues(queues, big_queue)

    # return items in queues to the Big Queue

    for k in range(len(queues)):

    while queues[k].size() > 0:

    item = queues[k].dequeue()

    big_queue.enqueue(item)

    # Remove '#' padding from each of the strings

    results = []

    for i in range(big_queue.size()):

    item = big_queue.dequeue()

    new_item = ''

    for j in range(len(item)):

    if item[j] != '#':

    new_item += item[j]

    results.append(new_item)

    return results

    # Prints how many items are in a queue

    def print_queues(queues, big_queue):

    for i in range(len(queues)):

    print("Q" + str(i) + ":", queues[i].size())

    print("Big Queue:", big_queue.size())

    # Gets which queue the string will go into

    def get_index(item, i):

    if item[-i] == '#':

    return 0

    if item[-i].isdigit():

    return eval(str(item)[-i])

    if item[-i].isalpha():

    return ord(item[-i]) - 86

    def main():

    # read the number of words in file

    line = sys.stdin.readline()

    line = line.strip()

    num_words = int (line)

    # create a word list

    word_list = []

    for i in range (num_words):

    line = sys.stdin.readline()

    word = line.strip()

    word_list.append (word)

    # print word_list

    #print (word_list)

    # use radix sort to sort the word_list

    sorted_list = radix_sort (word_list)

    # print the sorted_list

    print (sorted_list)

    if __name__ == "__main__":

    main()

  • # File: Chess.py

    # Description: Given the size of a chess board, return the number of

    # solutions in which 8 queens can stand without threatening each other.

    import sys

    class Queens (object):

    def __init__ (self, n = 8):

    self.board = []

    self.n = n

    self.solutions = 0

    for i in range (self.n):

    row = []

    for j in range (self.n):

    row.append ('*')

    self.board.append (row)

    # print the board

    def print_board (self):

    for i in range (self.n):

    for j in range (self.n):

    print (self.board[i][j], end = ' ')

    print ()

    print ()

    # check if a position on the board is valid

    def is_valid (self, row, col):

    for i in range (self.n):

    if (self.board[row][i] == 'Q') or (self.board[i][col] == 'Q'):

    return False

    for i in range (self.n):

    for j in range (self.n):

    row_diff = abs (row - i)

    col_diff = abs (col - j)

    if (row_diff == col_diff) and (self.board[i][j] == 'Q'):

    return False

    return True

    def solve(self, col):

    if (col == self.n):

    self.solutions += 1

    #self.print_board()

    return

    for i in range(self.n):

    if self.is_valid(i, col):

    self.board[i][col] = 'Q'

    self.solve(col + 1)

    self.board[i][col] = '*'

    def main():

    # read the size of the board

    line = sys.stdin.readline()

    line = line.strip()

    n = int (line)

    # create a chess board

    game = Queens (n)

    # place the queens on the board and count the solutions

    game.solve(0)

    # print the number of solutions

    print(game.solutions)

    if __name__ == "__main__":

    main()

Previous
Previous

Automatic Texture ID Applier