|
1 | 1 | #!/usr/bin/python |
2 | 2 |
|
3 | | -__author__ = "Mari Wahl" |
4 | | - |
| 3 | +__author__ = "bt3" |
5 | 4 |
|
6 | 5 |
|
7 | | -from binary_tree import NodeBT, BinaryTree |
| 6 | +class Node(object): |
8 | 7 |
|
| 8 | + def __init__(self, item=None,): |
9 | 9 |
|
10 | | -class NodeBST(NodeBT): |
11 | | - |
12 | | - def __init__(self, item=None, level=0): |
13 | 10 | self.item = item |
14 | | - self.level = level |
15 | 11 | self.left = None |
16 | 12 | self.right = None |
17 | 13 |
|
| 14 | + def __repr__(self): |
| 15 | + return '{}'.format(self.item) |
| 16 | + |
| 17 | + |
| 18 | + def _add(self, value): |
| 19 | + new_node = Node(value) |
18 | 20 |
|
19 | | - def _addNextNode(self, value, level_here=1): |
20 | | - new_node = NodeBST(value, level_here) |
21 | 21 | if not self.item: |
22 | 22 | self.item = new_node |
| 23 | + |
23 | 24 | else: |
24 | 25 | if value > self.item: |
25 | | - self.right = self.right and self.right._addNextNode(value, level_here+1) or new_node |
| 26 | + self.right = self.right and self.right._add(value) or new_node |
26 | 27 | elif value < self.item: |
27 | | - self.left = self.left and self.left._addNextNode(value, level_here+1) or new_node |
| 28 | + self.left = self.left and self.left._add(value) or new_node |
28 | 29 | else: |
29 | 30 | print("BSTs do not support repeated items.") |
30 | | - return self # this is necessary!!! |
31 | 31 |
|
| 32 | + return self # this is necessary!!! |
32 | 33 |
|
33 | 34 |
|
34 | | - def _searchForNode(self, value): |
| 35 | + def _search(self, value): |
35 | 36 | if self.item == value: |
36 | | - return self |
| 37 | + return True # or self |
| 38 | + |
37 | 39 | elif self.left and value < self.item: |
38 | | - return self.left._searchForNode(value) |
| 40 | + return self.left._search(value) |
| 41 | + |
39 | 42 | elif self.right and value > self.item: |
40 | | - return self.right._searchForNode(value) |
| 43 | + return self.right._search(value) |
| 44 | + |
41 | 45 | else: |
42 | 46 | return False |
43 | 47 |
|
44 | 48 |
|
| 49 | + def _isLeaf(self): |
| 50 | + return not self.right and not self.left |
| 51 | + |
| 52 | + |
| 53 | + def _printPreorder(self): |
| 54 | + print self.item |
45 | 55 |
|
46 | | -class BinarySearchTree(BinaryTree): |
| 56 | + if self.left: |
| 57 | + return self.left._printPreorder() |
| 58 | + |
| 59 | + if self.right: |
| 60 | + return self.right._printPreorder() |
| 61 | + |
| 62 | + |
| 63 | + |
| 64 | +class BST(object): |
47 | 65 |
|
48 | 66 | def __init__(self): |
49 | 67 | self.root = None |
50 | 68 |
|
51 | | - def addNode(self, value): |
| 69 | + def add(self, value): |
52 | 70 | if not self.root: |
53 | | - self.root = NodeBST(value) |
| 71 | + self.root = Node(value) |
54 | 72 | else: |
55 | | - self.root._addNextNode(value) |
| 73 | + self.root._add(value) |
| 74 | + |
| 75 | + def printPreorder(self): |
| 76 | + if self.root: |
| 77 | + self.root._printPreorder() |
56 | 78 |
|
| 79 | + def search(self, value): |
| 80 | + if self.root: |
| 81 | + return self.root._search(value) |
57 | 82 |
|
58 | 83 |
|
59 | 84 |
|
60 | 85 | if __name__ == '__main__': |
61 | | - bst = BinarySearchTree() |
| 86 | + |
| 87 | + bst = BST() |
62 | 88 | print "Adding nodes 1 to 10 in the tree..." |
63 | | - for i in range(1, 10): |
64 | | - bst.addNode(i) |
65 | | - print "Is 8 a leaf? ", bst.isLeaf(8) |
66 | | - print "Whats the level of node 8? ", bst.getNodeLevel(8) |
67 | | - print "Is node 10 a root? ", bst.isRoot(10) |
68 | | - print "Is node 1 a root? ", bst.isRoot(1) |
69 | | - print "Whats the tree height? ", bst.getHeight() |
70 | | - print "Is this tree BST? ", bst.isBST() |
71 | | - print "Is this tree balanced? ", bst.isBalanced() |
| 89 | + for i in range(1, 11): |
| 90 | + bst.add(i) |
| 91 | + |
| 92 | + print |
| 93 | + print "Searching for nodes 16 and 6" |
| 94 | + print bst.search(16) |
| 95 | + print bst.search(6) |
| 96 | + |
| 97 | + print |
| 98 | + print "Printing preorder..." |
| 99 | + bst.printPreorder() |
| 100 | + |
| 101 | + |
72 | 102 |
|
73 | 103 |
|
0 commit comments