Beispiel #1
0
def main():
    #create BST:
    print('create BST with elements: 10, 5, 2, 6, 1, 4, 20, 15, 25')
    bst = BST(10)
    insert_in_BST = [5, 2, 6, 1, 4, 20, 15, 25]
    for item in insert_in_BST:
        bst.insert(item)

    # test find() -> find root with key = 2 and print key:
    print('find root with key=2 and print key:')
    print(bst.find(2).key)

    # find min/max:
    print('find node with min key and print key (should be 1):')
    print(bst.findMin().key)
    print('find node with max key and print key (should be 25):')
    print(bst.findMax().key)

    # traverse tree / delete nodes:
    print('traverse tree in order and print all keys:')
    bst.traverseInOrder()
    print('delete node with key=5 and traverse tree again:')
    bst.delete(5)
    bst.traverseInOrder()

    # get root and print it's key:
    print('get root key (should be 10)')
    print(bst.getRoot().key)
Beispiel #2
0
def testDelete():
    t = BST()
    t.put(2)
    t.put(1)
    t.put(3)
    t.delete(1)
    assert not t.contains(1)
Beispiel #3
0
def main(argv):
    #create a new tree
    tree = BST()



    #open file argument
    file = open(argv[1], "r")
    # goes for amount of of lines in f
    for line in file:
        text = line.split()
        #test cases for what the first element in the list is
        if text[0] == "insert":
            #saves the second element, since it exists
            data = text[1]
            tree.insert(data)
        elif text[0] == "delete":
            #saves element, then calls delete
            data = text[1]
            tree.delete(data)
        elif text[0] == "preorder" or text[0] == "postorder" or text[0] == "inorder":
            #tests for if a traverse then calls the function
            tree.traverse(text[0], tree.getRoot())
        else:
            print("incorrect format")

    return 0
Beispiel #4
0
def main(argv):
    input_file = argv[1]

    # Instance of the binary search tree
    tree = BST()

    with open(input_file, 'r') as file_ob:
        for line in file_ob:
            line = line.split()

            if line[0] == 'insert':
                tree.insert(int(line[1]))

            if line[0] == 'delete':
                tree.delete(int(line[1]))

            if line[0] == 'preorder':
                tree.traverse('preorder', tree.getRoot())
                print("")

            if line[0] == 'inorder':
                tree.traverse('inorder', tree.getRoot())
                print("")

            if line[0] == 'postorder':
                tree.traverse('postorder', tree.getRoot())
                print("")

        # Close the file
        file_ob.close()
Beispiel #5
0
def test_BST():
    bst = BST()

    # Test empty tree
    assert (len(bst.BFS()) == 0)

    # Test insert
    bst.insert(2)
    bst.insert(3)
    bst.insert(1)
    assert (len(bst.BFS()) == 3)
    expected = [2, 1, 3]
    actual = [node.value for node, l in bst.BFS()]
    assert_(expected, actual)

    # Test search
    assert (bst.search(2) is True)
    assert (bst.search(5) is False)

    # Test-1 Pre Order Traversal
    bst.insert(0)
    pre_order_expected = [2, 1, 0, 3]
    pre_order_actual = bst.pre_order_traversal()
    assert_(pre_order_expected, pre_order_actual)

    # Test-2 In-Order Traversal
    in_order_expected = [0, 1, 2, 3]
    in_order_actual = bst.in_order_traversal()
    assert_(in_order_expected, in_order_actual)

    # Test-3 Post-Order Traversal
    post_order_expected = [0, 1, 3, 2]
    post_order_actual = bst.post_order_traversal()
    assert_(post_order_expected, post_order_actual)

    # Test-4 Delete
    bst.delete(3)
    delete_expected_output = [0, 1, 2]
    delete_actual_output = bst.post_order_traversal()
    assert_(delete_expected_output, delete_actual_output)

    # Test-5 Delete
    bst.insert(5)
    bst.insert(4)
    bst.insert(8)
    bst.insert(6)
    bst.insert(9)
    delete_expected_output = [0, 1, 2, 4, 6, 8, 9]
    bst.delete(5)
    delete_actual_output = bst.in_order_traversal()
    assert_(delete_expected_output, delete_actual_output)
Beispiel #6
0
    def test_delete_w_one_child(self):
        bin = BST()
        bin.insert(5)
        bin.insert(2)
        bin.insert(18)
        bin.insert(-4)
        bin.insert(3)
        bin.insert(21)
        bin.insert(19)
        bin.insert(25)

        bin.delete(bin.root.right)

        self.assertEqual([x.val for x in bin.get_level(1)], [2, 21])
Beispiel #7
0
    def test_delete_w_two_children(self):
        bin = BST()
        bin.insert(5)
        bin.insert(2)
        bin.insert(12)
        bin.insert(-4)
        bin.insert(3)
        bin.insert(9)
        bin.insert(21)
        bin.insert(19)
        bin.insert(25)

        bin.delete(bin.root.right)

        self.assertEqual([x.val for x in bin.get_level(1)], [2, 19])
        self.assertEqual([x.val for x in bin.get_level(3)], [25])
Beispiel #8
0
    def test_delete_w_no_children(self):
        bin = BST()
        bin.insert(7)
        bin.insert(3)
        bin.insert(8)
        bin.insert(1)
        bin.insert(5)
        bin.insert(2)
        bin.insert(4)
        bin.insert(6)
        bin.insert(10)
        bin.insert(9)
        bin.insert(20)

        bin.delete(bin.root.right.right.right)

        self.assertEqual([x.val for x in bin.get_level(3)], [2, 4, 6, 9])
Beispiel #9
0
def main(argv):

    tree = BST(
    )  # Creating the instance of a binary search tree, and going to be
    # referring to it as tree.

    input_file = argv[
        1]  # This will be the input file with the tree instructions
    # passed in as an argument when the program is compiled.

    with open(input_file, 'r') as file_object:

        # Looping over the input file (file is passed in as argv[1])
        for line in file_object:
            # splitting each line into a task and a number, so this would mean that
            # the task will be refered to as line[0] and then the actual number
            # is going to be referred to as line[1] after the split.
            line = line.rstrip('\n')
            line = line.split()

            if line[0] == "insert":
                # calling the insert function.
                tree.insert((line[1]))

            if line[0] == "inorder":
                # for the tree traversals, these will only call the traverse function
                # which will then decide which traversal to execute.
                tree.traverse(line[0], tree.getRoot())
                print "\n",

            if line[0] == "preorder":
                tree.traverse(line[0], tree.getRoot())
                print "\n",

            if line[0] == "postorder":
                tree.traverse(line[0], tree.getRoot())
                print "\n",

            if line[0] == "delete":
                tree.delete(line[1])

    file_object.close()  # closing the input file after we finish reading it.
Beispiel #10
0
def main(argv):
	# Loop over input file (filename passed via argv).
	# Split each line into a task and number (if one exists) 
	#   hint: use the split method for strings https://docs.python.org/2/library/string.html#string.split
	# Perform the function corresponding to the specified task
	# i.e., insert, delete, inorder, preorder, postorder
	# Close the file when you're done.
	filename = argv[1]
	file = open(filename, "r")

	bst = BST()

	for line in file:
		line = line.strip('\n')
		task = line.split(" ")

		# If task is insert
		if (task[0] == "insert"):
			val = int(task[1])
			bst.insert(val)

		# If task is delete
		elif (task[0] == "delete"):
			val = int(task[1])
			bst.delete(val)

		# If task is inorder
		elif (task[0] == "inorder"):
			bst.traverse(task[0], bst.getRoot()) 

		# If task is preorder
		elif (task[0] == "preorder"):
			bst.traverse(task[0], bst.getRoot())

		# If task is postorder
		elif (task[0] == "postorder"):
			bst.traverse(task[0], bst.getRoot())

	# Close file
	file.close()
Beispiel #11
0
class Window(object):
    def silentremove(self, filename):
        try:
            os.remove(filename)
        except OSError as e:  # this would be "except OSError, e:" before Python 2.6
            if e.errno != errno.ENOENT:  # errno.ENOENT = no such file or directory
                raise

    def __init__(self, master):
        self.silentremove("tree.png")
        self.silentremove("tree")
        self.tree = BST()
        self.display = None
        self.img = tkinter.Label(master)
        self.btn_add = tkinter.Button(master, text="add")
        self.btn_del = tkinter.Button(master, text="del")
        self.entry_node = tkinter.Entry(master)
        self.btn_add.bind("<Button-1>", self.add_element)
        self.btn_del.bind("<Button-1>", self.del_element)
        self.btn_add.pack(side="bottom")
        self.btn_del.pack(side="bottom")
        self.entry_node.pack(side="bottom")
        self.img.pack(fill="both")

    def del_element(self, event):
        self.tree.delete(int(self.entry_node.get()))
        self.tree.draw().render("tree")
        self.display = ImageTk.PhotoImage(image=Image.open("tree.png"))
        self.img.pack_forget()
        self.img = tkinter.Label(image=self.display)
        self.img.pack()

    def add_element(self, event):
        self.tree.insert(int(self.entry_node.get()))
        self.tree.draw().render("tree")
        self.display = ImageTk.PhotoImage(image=Image.open("tree.png"))
        self.img.pack_forget()
        self.img = tkinter.Label(image=self.display)
        self.img.pack()
Beispiel #12
0
def main(argv):
    # Loop over input file (filename passed via argv).
    # Split each line into a task and number (if one exists)
    #   hint: use the split method for strings https://docs.python.org/2/library/string.html#string.split
    # Perform the function corresponding to the specified task
    # i.e., insert, delete, inorder, preorder, postorder
    # Close the file when you're done.
    file = argv[1]
    tasklist = []
    tree = BST()
    with open(file, 'r') as file_ob:
        for line in file_ob:
            tasks = line.strip()  #strips whitespace
            calls = tasks.split(
                " ")  #separates commands (some require 2 arguments)
            tasklist.append(calls)

        for task in tasklist:
            #these types of commands are the traversals inorder, preorder, postorder
            if task[0] == "inorder":
                tree.traverse("inorder", tree.getRoot())
                print("")  # just to make my output a little more readable
            elif task[0] == "preorder":
                tree.traverse("preorder", tree.getRoot())
                print("")  # just to make my output a little more readable
            elif task[0] == "postorder":
                tree.traverse("postorder", tree.getRoot())
                print("")  # just to make my output a little more readable
            elif len(task) == 2:
                command = task[0]  #here are the insert/delete commands
                value = int(task[1])
                if command == "insert":
                    tree.insert(value)
                elif command == "delete":
                    tree.delete(value)
                else:
                    print("this is not an appropriate BST method")
Beispiel #13
0
 def delete(self, z):
     if (z.p != self.nil):
         parent = z.p
         BST.delete(self, z)
         splay(parent)
     BST.delete(self, z)
Beispiel #14
0
def BSTFullTest():
    """
    Various tests for the BST class, including insertion, deletion, inorder walks, etc.
    For BST class testing.
    """
    print "\nTesting BST: random tests"
    for i in range(20):
        tree = BST()
        passed = BSTRandomTest(tree, 1000)
        if passed:
            print "Passed random test", i + 1

    print "\nTesting BST: various operations"
    tree = BST()
    for i in range(20):
        v = random.randint(-99, 99)
        tree.insert(Node(v))

    print "Height =", tree.height()
    print "Minimum =", tree.minimum()
    print "Maximum =", tree.maximum()
    print "In-order Walk =", tree.inorderWalk()
    print "Random tree ="
    print tree

    arr = [21, 45, 1, 34, 8, -1, 99, -54, 60, 2]
    tree = BSTFromArray(arr)
    print("Test tree:")
    print(tree)
    print("Root:")
    print(tree._r)
    print("In order walk:")
    print(tree.inorderWalk())
    print("Min, max:")
    print(str(tree.minimum()), str(tree.maximum()))

    print("Height = ", tree.height())

    print("Successor of 34:")
    n = tree.search(34)
    s = tree.successor(n)
    print(s)

    print("Successor of 100:")
    n = tree.search(100)
    s = tree.successor(n)
    print(s)

    print("Predecessor of 34:")
    n = tree.search(34)
    s = tree.predecessor(n)
    print(s)

    print("Predecessor of -54:")
    n = tree.search(-54)
    s = tree.predecessor(n)
    print(s)

    print("Find and delete 34:")
    n = tree.search(34)
    print(n)
    tree.delete(n)
    print(tree.inorderWalk())

    print("Find and delete 21:")
    n = tree.search(21)
    s = tree.successor(n)
    print(n)
    print(s)
    tree.delete(n)
    print(tree.inorderWalk())
    print(tree._r)
    print(tree._r.right)
    print(tree._r.right.parent)
Beispiel #15
0
    print bst.getvalue(1)
    print bst.getvalue(5)
    print bst.getvalue(10)
    print bst.getvalue(3)
    print bst.getvalue(7)
    print bst.getvalue(14)

except RuntimeError as e:
    print e'''

key = 19
if key in bst:
    print "I am in bst"
else:
    print 'No i am not'
print 'deleted ', bst.delete(5), '\n'
bst.printinorder()
print bst.getsize(),'\n'

print 'deleted ', bst.delete(9), '\n'
bst.printinorder()
print bst.getsize(),'\n'

print 'deleted ', bst.delete(7), '\n'
bst.printinorder()
print bst.getsize(),'\n'

print 'deleted ', bst.delete(10), '\n'
bst.printinorder()
print bst.getsize(),'\n'
Beispiel #16
0
def main():
    #start Binary Search Tree
    bst = BST()
    timeforInsertBST = time.time()
    print(
        "First insecd crt 50000 random nodes into an empty tree and print the tree."
    )
    for i in range(50000):
        n = random.randint(0, 1000000)
        bst.insert(BSTNode(n, bst.nil, bst.nil, bst.nil))
    print("time for BST to insert", time.time() - timeforInsertBST)

    timeforSearchBST = time.time()
    print("\nNow do 10000 searches. ")
    count = 0
    for i in range(10000):
        n = random.randint(0, 1000000)
        if bst.search(n) == bst.nil:
            count = count + 1

    print("time for BST to search =", time.time() - timeforSearchBST)
    ##print time.time()-start1, "time for BST search"
    print(count)

    timeForDeleteBST = time.time()
    print("\nNow search for & delete some nodes.")
    for i in range(1000):
        n = random.randint(0, 1000000)
        z = bst.search(n)
        if z != bst.nil:
            bst.delete(z)
    print("time for BST delete =", time.time() - timeForDeleteBST)

    ##start splay tree
    splayTree = SplayTree()
    timeforInsertSplay = time.time()
    print(
        "\nFirst insert 50000 random nodes into an empty tree and print the tree."
    )
    n = random.randint(0, 1000)
    for i in range(50000):
        n = n + 1
        splayTree.insert(
            BSTNode(n, splayTree.nil, splayTree.nil, splayTree.nil))
    print("time for splay to insert =", time.time() - timeforInsertSplay)

    timeForSearchSplay = time.time()
    print("\nNow do 10000 searches. ")
    count2 = 0
    n = random.randint(0, 1000)
    for i in range(10000):
        n = n + 1
        if splayTree.search(n) == splayTree.nil:
            count2 = count2 + 1

    print("time for splay to search =", time.time() - timeForSearchSplay)
    print(count2)

    timeForDeleteSplay = time.time()
    print("\nNow search for & delete some nodes.")
    n = random.randint(0, 1000)
    for i in range(1000):
        n = n + 1
        z = splayTree.search(n)
        if z != splayTree.nil:
            splayTree.delete(z)
    print("time for splay delete =", time.time() - timeForDeleteSplay)