Browse Source

Create bintree.py

pull/12/head
José Luis López Zaragoza 5 years ago
committed by GitHub
parent
commit
573b05d5a5
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 172 additions and 0 deletions
  1. +172
    -0
      sorting/bintree.py

+ 172
- 0
sorting/bintree.py View File

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

Loading…
Cancel
Save