Python Week7 Lecture4 Handout
Python Week7 Lecture4 Handout
PROGRAMMING,
DATA STRUCTURES AND
ALGORITHMS IN PYTHON
Week 7, Lecture 4
Values in left
subtree < v 2 8
Values in right
subtree > v
1 4 9
No duplicate values
Binary search tree
For each node with 5
value v
Values in left
subtree < v 2 8
Values in right
subtree > v
1 4 9
No duplicate values
Binary search tree
For each node with 5
value v
Values in left
subtree < v 2 8
Values in right
subtree > v
1 4 9
No duplicate values
Binary search tree
For each node with 5
value v
Values in left
subtree < v 2 8
Values in right
subtree > v
1 4 9
No duplicate values
Binary search tree
For each node with 5
value v
Values in left
subtree < v 2 8
Values in right
subtree > v
1 4 9
No duplicate values
Binary search tree
Each node has a value and points to its children
value left right
5 5
8 None
2 8
9 None None
1 None None 1 4 9
4 None None
A better representation
Leaf node has value that is not None, left and right
children point to empty nodes
1 4 9
2 8 None
4 None None
Binary search tree 5
1 4 9
2 8
None
1 None 9
None
None None
None None
4 None None
None None
None None None None
None None
None None
None None
The class Tree
class Tree:
def __init__(self,initval=None):
self.value = initval
if self.value:
self.left = Tree()
self.right = Tree()
else:
self.left = None
self.right = None
return()
def isempty(self):
return(self.value == None)
Inorder traversal
def inorder(self): 5
if self.isempty():
return([])
else:
return(
2 8
self.left.inorder() +
[self.value] +
self.right.inorder()
)
1 4 9
def __str__(self):
return(str(self.inorder())
Inorder traversal
def inorder(self): 5
if self.isempty():
return([])
else:
return(
2 8
self.left.inorder() +
[self.value] +
self.right.inorder()
)
1 4 9
def __str__(self):
return(str(self.inorder())
Inorder traversal
def inorder(self): 5
if self.isempty():
return([])
else:
return(
2 8
self.left.inorder() +
[self.value] +
self.right.inorder()
)
1 4 9
def __str__(self):
return(str(self.inorder())
Inorder traversal
def inorder(self): 5
if self.isempty():
return([])
else:
return(
2 8
self.left.inorder() +
[self.value] +
self.right.inorder()
)
1 4 9
def __str__(self):
return(str(self.inorder())
Inorder traversal
def inorder(self): 5
if self.isempty():
return([])
else:
return(
2 8
self.left.inorder() +
[self.value] +
self.right.inorder()
)
1 4 9
def __str__(self):
return(str(self.inorder())
1
Inorder traversal
def inorder(self): 5
if self.isempty():
return([])
else:
return(
2 8
self.left.inorder() +
[self.value] +
self.right.inorder()
)
1 4 9
def __str__(self):
return(str(self.inorder())
1 2
Inorder traversal
def inorder(self): 5
if self.isempty():
return([])
else:
return(
2 8
self.left.inorder() +
[self.value] +
self.right.inorder()
)
1 4 9
def __str__(self):
return(str(self.inorder())
1 2 4
Inorder traversal
def inorder(self): 5
if self.isempty():
return([])
else:
return(
2 8
self.left.inorder() +
[self.value] +
self.right.inorder()
)
1 4 9
def __str__(self):
return(str(self.inorder())
1 2 4 5
Inorder traversal
def inorder(self): 5
if self.isempty():
return([])
else:
return(
2 8
self.left.inorder() +
[self.value] +
self.right.inorder()
)
1 4 9
def __str__(self):
return(str(self.inorder())
1 2 4 5 8
Inorder traversal
def inorder(self): 5
if self.isempty():
return([])
else:
return(
2 8
self.left.inorder() +
[self.value] +
self.right.inorder()
)
1 4 9
def __str__(self):
return(str(self.inorder())
if self.isempty():
return(False)
if self.value == v:
return(True)
if v < self.value:
return(self.left.find(v))
else
return(self.right.find(v))
Minimum
Left most node in the tree
5
def minval(self):
16 44 91
28 83
Insert v
Insert 21
Try to find v
52
If it is not present, add it
where the search fails 37 74
16 44 91
28 83
Insert v
Insert 21
Try to find v
52
If it is not present, add it
where the search fails 37 74
16 44 91
28 83
21
Insert v
Insert 65
Try to find v
52
If it is not present, add it
where the search fails 37 74
16 44 91
28 83
21
Insert v
Insert 65
Try to find v
52
If it is not present, add it
where the search fails 37 74
16 44 91
28 83
21
Insert v
Insert 65
Try to find v
52
If it is not present, add it
where the search fails 37 74
16 44 65 91
28 83
21
Insert v
Insert 91
Try to find v
52
If it is not present, add it
where the search fails 37 74
16 44 65 91
28 83
21
Insert v
Insert 91
Try to find v
52
If it is not present, add it
where the search fails 37 74
16 44 65 91
28 83
21
Insert v
def insert(self,v):
if v < self.value:
self.left.insert(v)
return
if v > self.value:
self.right.insert(v)
return
Delete v
If v is present, delete it Delete 65
If deleted node is a leaf, done
52
If deleted node has only one child,
“promote” that child 37 74
Delete self.left.maxval()—
must be leaf or have only one child 21
Delete v
If v is present, delete it Delete 65
If deleted node is a leaf, done
52
If deleted node has only one child,
“promote” that child 37 74
Delete self.left.maxval()—
must be leaf or have only one child 21
Delete v
If v is present, delete it Delete 65
If deleted node is a leaf, done
52
If deleted node has only one child,
“promote” that child 37 74
Delete self.left.maxval()—
must be leaf or have only one child 21
Delete v
If v is present, delete it Delete 74
If deleted node is a leaf, done
52
If deleted node has only one child,
“promote” that child 37 74
Delete self.left.maxval()—
must be leaf or have only one child 21
Delete v
If v is present, delete it Delete 74
If deleted node is a leaf, done
52
If deleted node has only one child,
“promote” that child 37 74
Delete self.left.maxval()—
must be leaf or have only one child 21
Delete v
If v is present, delete it Delete 74
If deleted node is a leaf, done
52
If deleted node has only one child,
“promote” that child 37 91
Delete self.left.maxval()—
must be leaf or have only one child 21
Delete v
If v is present, delete it Delete 37
If deleted node is a leaf, done
52
If deleted node has only one child,
“promote” that child 37 91
Delete self.left.maxval()—
must be leaf or have only one child 21
Delete v
If v is present, delete it Delete 37
If deleted node is a leaf, done
52
If deleted node has only one child,
“promote” that child 37 91
Delete self.left.maxval()—
must be leaf or have only one child 21
Delete v
If v is present, delete it Delete 37
If deleted node is a leaf, done
52
If deleted node has only one child,
“promote” that child 37 91
Delete self.left.maxval()—
must be leaf or have only one child 21
Delete v
If v is present, delete it Delete 37
If deleted node is a leaf, done
52
If deleted node has only one child,
“promote” that child 28 91
Delete self.left.maxval()—
must be leaf or have only one child 21
Delete v
If v is present, delete it Delete 37
If deleted node is a leaf, done
52
If deleted node has only one child,
“promote” that child 28 91
Delete self.left.maxval()—
must be leaf or have only one child
Delete v
If v is present, delete it
Delete self.left.maxval()—
must be leaf or have only one child
Delete v
def delete(self,v):
if self.isempty():
return
if v < self.value:
self.left.delete(v)
return
if v > self.value:
self.right.delete(v)
return
if v == self.value:
if self.isleaf():
self.makeempty()
elif self.left.isempty():
self.copyright()
else:
self.value = self.left.maxval()
self.left.delete(self.left.maxval())
return
Delete v # Convert leaf to
# empty node
def delete(self,v): def makeempty(self):
if self.isempty(): self.value = None
return self.left = None
self.right = None
if v < self.value:
return
self.left.delete(v)
return
if v > self.value:
self.right.delete(v)
return
if v == self.value:
if self.isleaf():
self.makeempty()
elif self.left.isempty():
self.copyright()
else:
self.value = self.left.maxval()
self.left.delete(self.left.maxval())
return
Delete v # Convert leaf to
# empty node
def delete(self,v): def makeempty(self):
if self.isempty(): self.value = None
return self.left = None
self.right = None
if v < self.value:
return
self.left.delete(v)
return