|
@ -0,0 +1,172 @@ |
|
|
|
|
|
class Node(): |
|
|
|
|
|
|
|
|
|
|
|
def __init__(self,key): |
|
|
|
|
|
self.key = key |
|
|
|
|
|
self.left = None |
|
|
|
|
|
self.right = None |
|
|
|
|
|
self.parent = None |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Tree(): |
|
|
|
|
|
|
|
|
|
|
|
def __init__(self): |
|
|
|
|
|
self.root = None |
|
|
|
|
|
|
|
|
|
|
|
def add_node(self,key,node=None): |
|
|
|
|
|
|
|
|
|
|
|
if node is None: |
|
|
|
|
|
node = self.root |
|
|
|
|
|
|
|
|
|
|
|
if self.root is None: |
|
|
|
|
|
self.root = Node(key) |
|
|
|
|
|
|
|
|
|
|
|
else: |
|
|
|
|
|
|
|
|
|
|
|
if key <= node.key : |
|
|
|
|
|
if node.left is None: |
|
|
|
|
|
node.left = Node(key) |
|
|
|
|
|
node.left.parent = node |
|
|
|
|
|
print "left" |
|
|
|
|
|
return |
|
|
|
|
|
else: |
|
|
|
|
|
# return self.add_node(key,node = self.root.left) |
|
|
|
|
|
return self.add_node(key,node = node.left) |
|
|
|
|
|
else: |
|
|
|
|
|
if node.right is None: |
|
|
|
|
|
node.right = Node(key) |
|
|
|
|
|
node.right.parent = node |
|
|
|
|
|
print "right" |
|
|
|
|
|
return |
|
|
|
|
|
else: |
|
|
|
|
|
# return self.add_node(key,node = self.root.right) |
|
|
|
|
|
return self.add_node(key,node = node.right) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def search(self,key,node = None): |
|
|
|
|
|
|
|
|
|
|
|
if node is None: |
|
|
|
|
|
node = self.root |
|
|
|
|
|
|
|
|
|
|
|
if self.root.key == key: |
|
|
|
|
|
print "key is at the root" |
|
|
|
|
|
return self.root |
|
|
|
|
|
|
|
|
|
|
|
else: |
|
|
|
|
|
if node.key == key : |
|
|
|
|
|
print "key exists" |
|
|
|
|
|
return node |
|
|
|
|
|
|
|
|
|
|
|
elif key < node.key and node.left is not None: |
|
|
|
|
|
print "left" |
|
|
|
|
|
return self.search(key,node = node.left) |
|
|
|
|
|
|
|
|
|
|
|
elif key > node.key and node.right is not None: |
|
|
|
|
|
print "right" |
|
|
|
|
|
return self.search(key,node = node.right) |
|
|
|
|
|
|
|
|
|
|
|
else: |
|
|
|
|
|
print "key does not exist" |
|
|
|
|
|
return None |
|
|
|
|
|
|
|
|
|
|
|
def delete_node(self,key,node=None): |
|
|
|
|
|
#search for the node to be deleted in tree |
|
|
|
|
|
if node is None: |
|
|
|
|
|
node = self.search(key)#return the node to be deleted |
|
|
|
|
|
|
|
|
|
|
|
#root has no parent node |
|
|
|
|
|
if self.root.key == node.key: #if it is root |
|
|
|
|
|
parent_node = self.root |
|
|
|
|
|
else: |
|
|
|
|
|
parent_node = node.parent |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
'''case 1: The node has no chidren''' |
|
|
|
|
|
if node.left is None and node.right is None: |
|
|
|
|
|
if key <= parent_node.key: |
|
|
|
|
|
parent_node.left = None |
|
|
|
|
|
else: |
|
|
|
|
|
parent_node.right = None |
|
|
|
|
|
return |
|
|
|
|
|
|
|
|
|
|
|
'''case 2: The node has children''' |
|
|
|
|
|
''' if it has a single left node''' |
|
|
|
|
|
if node.left is not None and node.right is None : |
|
|
|
|
|
if node.left.key < parent_node.key : |
|
|
|
|
|
parent_node.left = node.left |
|
|
|
|
|
else: |
|
|
|
|
|
parent_node.right = node.left |
|
|
|
|
|
|
|
|
|
|
|
return |
|
|
|
|
|
|
|
|
|
|
|
'''if it has a single right node''' |
|
|
|
|
|
if node.right is not None and node.left is None: |
|
|
|
|
|
if node.key <= parent_node.key: |
|
|
|
|
|
parent_node.left = node.right |
|
|
|
|
|
else: |
|
|
|
|
|
parent_node.right = node.right |
|
|
|
|
|
return |
|
|
|
|
|
|
|
|
|
|
|
'''if it has two children''' |
|
|
|
|
|
'''find the node with the minimum value from the right subtree. |
|
|
|
|
|
copy its value to thhe node which needs to be removed. |
|
|
|
|
|
right subtree now has a duplicate and so remove it.''' |
|
|
|
|
|
if node.left is not None and node.right is not None: |
|
|
|
|
|
min_value = self.find_minimum(node) |
|
|
|
|
|
node.key = min_value.key |
|
|
|
|
|
min_value.parent.left = None |
|
|
|
|
|
return |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def find_minimum(self,node = None): |
|
|
|
|
|
|
|
|
|
|
|
if node is None: |
|
|
|
|
|
node = self.root |
|
|
|
|
|
|
|
|
|
|
|
'''find mimimum value from the right subtree''' |
|
|
|
|
|
|
|
|
|
|
|
'''case when there is only a root node''' |
|
|
|
|
|
if node.right is not None: |
|
|
|
|
|
node = node.right |
|
|
|
|
|
else: |
|
|
|
|
|
return node |
|
|
|
|
|
|
|
|
|
|
|
if node.left is not None: |
|
|
|
|
|
return self.find_minimum(node = node.left) |
|
|
|
|
|
else: |
|
|
|
|
|
return node |
|
|
|
|
|
|
|
|
|
|
|
def tree_data(self,node=None): |
|
|
|
|
|
if node is None: |
|
|
|
|
|
node = self.root |
|
|
|
|
|
|
|
|
|
|
|
stack = [] |
|
|
|
|
|
while stack or node: |
|
|
|
|
|
if node is not None: |
|
|
|
|
|
stack.append(node) |
|
|
|
|
|
node = node.left |
|
|
|
|
|
else: |
|
|
|
|
|
node = stack.pop() |
|
|
|
|
|
yield node.key |
|
|
|
|
|
node = node.right |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
t=Tree() |
|
|
|
|
|
t.add_node(10) |
|
|
|
|
|
t.add_node(13) |
|
|
|
|
|
t.add_node(14) |
|
|
|
|
|
t.add_node(8) |
|
|
|
|
|
t.add_node(9) |
|
|
|
|
|
t.add_node(7) |
|
|
|
|
|
t.add_node(11) |
|
|
|
|
|
|
|
|
|
|
|
''' |
|
|
|
|
|
10---8---7 |
|
|
|
|
|
| | |
|
|
|
|
|
| ---9 |
|
|
|
|
|
---13---11 |
|
|
|
|
|
| |
|
|
|
|
|
---14 |
|
|
|
|
|
''' |