| @ -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 | |||||
| ''' | |||||