2015年3月29日星期日

Week10 SLOG: mutate Insert and Delete function

In this week, I have learned something about mutating functions like insert and delete in Binary Search Tree.
 
First of all, I need to define class BTNode and BST. And I also need to initialize them.
 
class BTNode:
    '''Binary Tree node.'''
    def __init__(self, data, left=None, right=None):
        ''' (BTNode, object, BTNode, BTNode) -> NoneType
        Create BTNode (self) with data and children left and right.
        '''
        self.data, self.left, self.right = data, left, right
 
Class BST:
'''Binary Search Tree node.'''
 
def __init__(self, root=None):
    '''(BST, BTNode or None) -> Nonetype
    
    Create BST with BTNode root.
    '''
    Self.root = root
 
    
Next, I mutate insert and delete methods.
def insert(node, data):
    ''' (BTNode, object) -> BTNode
    Insert data in BST rooted at node if necessary, and return new root.
    >>> b = BTNode(8)
    >>> b = insert(b, 4)
    >>> b = insert(b, 2)
    >>> b = insert(b, 6)
    >>> b = insert(b, 12)
    >>> b = insert(b, 14)
    >>> b = insert(b, 10)
    >>> print(b)
            14
        12
            10
    8
            6
        4
            2
    <BLANKLINE>
    '''
    return_node = node
    if not node:
        return_node = BTNode(data)
    elif data < node.data:
        node.left = insert(node.left, data)
    elif data > node.data:
        node.right = insert(node.right, data)
    else:  # nothing to do
        pass
    return return_node
def delete(node, data):
    ''' (BTNode, data) -> BTNode
    Delete, if it exists, node with data and return resulting tree.
    >>> b = BTNode(8)
    >>> b = insert(b, 4)
    >>> b = insert(b, 2)
    >>> b = insert(b, 6)
    >>> b = insert(b, 12)
    >>> b = insert(b, 14)
    >>> b = insert(b, 10)
    >>> b = delete(b, 12)
    >>> print(b)
            14
        10
    8
            6
        4
            2
    <BLANKLINE>
    '''
 
    if not node:
        pass
    elif data < node.data:
        node.left = delete(node.left, data)
    elif data > node.data:
        node.right = delete(node.right, data)
    elif not node.left:
        return_node = node.right
    elif not node.right:
        return_node = node.left
    else:
        node.data = _find_max(node.left).data
        node.left = delete(node.left, node.data)
    return return_node

没有评论:

发表评论