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