Skip to content

Derevo #34

Description

@kostyria

class Node:
def init(self, value):
self.value = value
self.left = None
self.right = None
self.parent = None

class BinarySearchTree:
def init(self):
self.root = None

def add_list(self, l):
    self.root = self.add_data(l, 0, len(l)-1)

def add_data(self, l, left, right):
    if left > right:
        return None

    mid = (left + right) // 2
    node = Node(l[mid])

    node.left = self.add_data(l, left, mid-1)
    if node.left is not None:
        node.left.parent = node

    node.right = self.add_data(l, mid+1, right)
    if node.right is not None:
        node.right.parent = node

    return node

def find(self, value):
    if self.root.value is None:
        return False
    
    if self.root.value == value:
        return True
    
    node = self.find_node(self.root, value)
    if node is None:
        return False
    
    return True

def find_node(self, cn, value):
    if cn is None:
        return None
    if cn.value == value:
        return cn
    if cn.value > value:
        res = self.find_node(cn.left, value)
        return res
    else:
        res = self.find_node(cn.right, value)
        return res
    
def find_min(self):
    node = self.find_min_node(self.root)
    return node.value

def find_min_node(self, cn):
    if cn.left is None:
        return cn
    node = self.find_min_node(cn.left)
    return node

def find_max(self):
    node = self.find_max_node(self.root)
    return node.value

def find_max_node(self, cn):
    if cn.right is None:
        return cn
    node = self.find_max_node(cn.right)
    return node

def delete(self, value):
    if (self.root.left is None and
            self.root.right is None and
            self.root.value == value):
        self.root.value = None
        return

    if (self.root.left is not None and
           self.root.right is None and
           self.root.value == value):
        self.root = self.root.left
        self.root.parent = None
        return

    if (self.root.left is None and
           self.root.right is not None and
           self.root.value == value):
        self.root = self.root.right
        self.root.parent = None
        return

    node = self.find_node(self.root, value)
    if node is None:
        raise Exception('Не могу найти узел для удаления')
    self.delete_data(node)

def delete_data(self, node):
    if (node.left is None and node.right is None):
        if node.parent.left == node:
            node.parent.left = None
        else:
            node.parent.right = None
        return
    
    if (node.left is not None and node.right is None):
        if node.parent.left == node:
            node.parent.left = node.left
        else:
            node.parent.right = node.left
        return

    if (node.left is None and node.right is not None):
        if node.parent.left == node:
            node.parent.left = node.right
        else:
            node.parent.right = node.right
        return
       
    if (node.left is not None and node.right is not None):
        if node.parent is None:
            self.root = self.find_min_node(node.right)
            self.root.left = node.left
            self.root.right = node.right
            return
        min_node_of_right = self.find_min_node(node.right)
        min_node_of_right.left = node.left
        if node.parent.left == node:
            node.parent.left = min_node_of_right
        else:
            node.parent.right = min_node_of_right
        return
    raise Exception('Что-то пощло не так. Не могу удалить узел')
    
def print_tree(self, node, level=0):
    if node is not None:
        print(' ' * 4 * level + f'- {node.value}')
        self.print_tree(node.left, level + 1)
        self.print_tree(node.right, level + 1)

nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
bst = BinarySearchTree()
bst.add_list(nums)
bst.print_tree(bst.root)
bst.delete(8)
bst.print_tree(bst.root)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions