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