From 573b05d5a5379a506f3283d75d82b0dfa24024f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Luis=20L=C3=B3pez=20Zaragoza?= Date: Wed, 17 Oct 2018 22:33:24 -0500 Subject: [PATCH] Create bintree.py --- sorting/bintree.py | 172 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 172 insertions(+) create mode 100644 sorting/bintree.py diff --git a/sorting/bintree.py b/sorting/bintree.py new file mode 100644 index 0000000..d44a36b --- /dev/null +++ b/sorting/bintree.py @@ -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 +'''