Module dsa.tree

Expand source code
class Node:
    def __init__(self, value, left=None, right=None):
        self.value = value
        self.left = left
        self.right = right

    def print(self, level=0):
        ''' print contents of a tree horizontally '''
        if self.right:
            self.right.print(level + 1)
        print("   " * level + str(self.value))
        if self.left:
            self.left.print(level + 1)

class Tree:
    def __init__(self, node=None):
        self.root = node
        
    def search(self, value):
        ''' returns node of value if found, otherwise, return None '''
        current = self.root
        
        while current is not None:
            if value == current.value:
                return current
            elif value < current.value:
                current = current.left
            elif value > current.value:
                current = current.right
            else:
                return None
        
        return None
    
    def insert(self, value):
        current = self.root
        if self.root is None:
            self.root = Node(value)
            return
        
        while current is not None:
            if value < current.value:
                if current.left is None:
                    current.left = Node(value)
                    return
                else:
                    current = current.left
            elif value > current.value:
                if current.right is None:
                    current.right = Node(value)
                    return
                else:
                    current = current.right
            else:
                return 
   
    def delete(self, value):
        ''' delete node with given value '''
        return self.delete_node(value, self.root)
        
    def delete_node(self, value, node):
        if node is None:
            return None
        
        if value < node.value:
            node.left = self.delete_node(value, node.left)
        elif value > node.value:
            node.right = self.delete_node(value, node.right)
        else:
            if node.left is None:
                branch = node.right
                node = None
                return branch
            elif node.right is None:
                branch = node.left
                node = None
                return branch
            
            branch = self.min_node(node.right)
            node.value = branch.value
            node.right = self.delete_node(branch.value, node.right)
            
        return node
    
    def min_node(self, node=None):
        if node is None:
            node = self.root
        
        if node.left is None:
            return node
        else:
            return self.min_node(node.left)
    
    def print(self):
        self.root.print()
        
        

Classes

class Node (value, left=None, right=None)
Expand source code
class Node:
    def __init__(self, value, left=None, right=None):
        self.value = value
        self.left = left
        self.right = right

    def print(self, level=0):
        ''' print contents of a tree horizontally '''
        if self.right:
            self.right.print(level + 1)
        print("   " * level + str(self.value))
        if self.left:
            self.left.print(level + 1)

Methods

def print(self, level=0)

print contents of a tree horizontally

Expand source code
def print(self, level=0):
    ''' print contents of a tree horizontally '''
    if self.right:
        self.right.print(level + 1)
    print("   " * level + str(self.value))
    if self.left:
        self.left.print(level + 1)
class Tree (node=None)
Expand source code
class Tree:
    def __init__(self, node=None):
        self.root = node
        
    def search(self, value):
        ''' returns node of value if found, otherwise, return None '''
        current = self.root
        
        while current is not None:
            if value == current.value:
                return current
            elif value < current.value:
                current = current.left
            elif value > current.value:
                current = current.right
            else:
                return None
        
        return None
    
    def insert(self, value):
        current = self.root
        if self.root is None:
            self.root = Node(value)
            return
        
        while current is not None:
            if value < current.value:
                if current.left is None:
                    current.left = Node(value)
                    return
                else:
                    current = current.left
            elif value > current.value:
                if current.right is None:
                    current.right = Node(value)
                    return
                else:
                    current = current.right
            else:
                return 
   
    def delete(self, value):
        ''' delete node with given value '''
        return self.delete_node(value, self.root)
        
    def delete_node(self, value, node):
        if node is None:
            return None
        
        if value < node.value:
            node.left = self.delete_node(value, node.left)
        elif value > node.value:
            node.right = self.delete_node(value, node.right)
        else:
            if node.left is None:
                branch = node.right
                node = None
                return branch
            elif node.right is None:
                branch = node.left
                node = None
                return branch
            
            branch = self.min_node(node.right)
            node.value = branch.value
            node.right = self.delete_node(branch.value, node.right)
            
        return node
    
    def min_node(self, node=None):
        if node is None:
            node = self.root
        
        if node.left is None:
            return node
        else:
            return self.min_node(node.left)
    
    def print(self):
        self.root.print()

Methods

def delete(self, value)

delete node with given value

Expand source code
def delete(self, value):
    ''' delete node with given value '''
    return self.delete_node(value, self.root)
def delete_node(self, value, node)
Expand source code
def delete_node(self, value, node):
    if node is None:
        return None
    
    if value < node.value:
        node.left = self.delete_node(value, node.left)
    elif value > node.value:
        node.right = self.delete_node(value, node.right)
    else:
        if node.left is None:
            branch = node.right
            node = None
            return branch
        elif node.right is None:
            branch = node.left
            node = None
            return branch
        
        branch = self.min_node(node.right)
        node.value = branch.value
        node.right = self.delete_node(branch.value, node.right)
        
    return node
def insert(self, value)
Expand source code
def insert(self, value):
    current = self.root
    if self.root is None:
        self.root = Node(value)
        return
    
    while current is not None:
        if value < current.value:
            if current.left is None:
                current.left = Node(value)
                return
            else:
                current = current.left
        elif value > current.value:
            if current.right is None:
                current.right = Node(value)
                return
            else:
                current = current.right
        else:
            return 
def min_node(self, node=None)
Expand source code
def min_node(self, node=None):
    if node is None:
        node = self.root
    
    if node.left is None:
        return node
    else:
        return self.min_node(node.left)
def print(self)
Expand source code
def print(self):
    self.root.print()
def search(self, value)

returns node of value if found, otherwise, return None

Expand source code
def search(self, value):
    ''' returns node of value if found, otherwise, return None '''
    current = self.root
    
    while current is not None:
        if value == current.value:
            return current
        elif value < current.value:
            current = current.left
        elif value > current.value:
            current = current.right
        else:
            return None
    
    return None