Двоичное дерево в Python не работает

голоса
2
class Node:
    '''represents a new node in the BST'''
    def __init__(self,key):
        self.key=key
        self.disconnect()
    def disconnect(self):
        self.left=None;
        self.right=None;
        self.parent=None;
    def __str__(self):
        return 'node with kay %s'%self.key

class BST:
    def __init__(self):
        self.root=None
    def insert(self,t):
        '''inserts a new element into the tree'''
        self.find_place(self.root,t)

    def find_place(self,node,key):
        finds the right place of the element recursively
        if node is None:
            node=Node(key)
            print node
        else:
            if node.key > key:
                find_place(node.left,key)
            else:
                find_place(node.right,key)
def test():
    '''function to test if the BST is working correctly'''

я написал выше код для реализации двоичного дерева поиска, но метод вставки не работает, как ожидалось, он не может добавить даже корневой элемент. я не могу undestand причины.

Задан 20/06/2010 в 08:40
источник пользователем
На других языках...                            


2 ответов

голоса
1

Вы на самом деле не добавления каких-либо узлов в дереве!

Его легче всего управлять добавлением корневого узла в явном виде, как вы видите , что я сделал ниже в insert.

find_placeФункция будет, предположительно , от имени, возвращает родительский узел , а также является ли это левый или правый слот для ключа? Я сделал явную _do_insertфункцию ниже , что и ходит и вставку.

С тех пор, вы должны ходить по дереву, каждый раз, видя, если вы рекурсию вниз ветку или уже достигли ли вы пустой слот, в котором вы добавляете новый узел.

Это может быть естественным , чтобы реорганизовать свой код , чтобы положить ответственность за ходьбу дерева (и делают добавляет, удаляют и такие) в Nodeкласс.

В приведенном ниже коде, я игнорирую, добавив ключ, который уже в дереве, я просто молча выйти:

def insert(self,t):
    '''inserts a new element into the tree'''
    if self.root is None:
        self.root = Node(t)
    else:
        self._do_insert(self.root,t)

def _do_insert(self,parent,t):
    if t > parent.key:
        if parent.left is None:
            parent.left = Node(t)
        else:
            self._do_insert(parent.left,t)
    elif t < parent.key:
        if parent.right is None:
            parent.right = Node(t)
        else:
            self._do_insert(parent.right,t)
    else:
        # raise a KeyError or something appropriate?
        pass
Ответил 20/06/2010 в 08:51
источник пользователем

голоса
0

Вот еще BST с Python, используя ключ сортировки

ЛЕВЫЙ ПРАВЫЙ = 0 = 1 ЗНАЧЕНИЕ = 2 SORT_KEY = -1

Класс BinarySearchTree (объект):

def __init__(self, sort_key=None):
    self._root = []  
    self._sort_key = sort_key
    self._len = 0  

Защита вставки (сам, VAL): если self._sort_key является None: sort_key = значение // если ни одна из кнопок сортировки, ключ сортировки не является значением еще: sort_key = self._sort_key (вал)

node = self._root
while node:
    if sort_key < node[_SORT_KEY]:
        node = node[LEFT]
    else:
        node = node[RIGHT]

if sort_key is val:
    node[:] = [[], [], val]
else:
    node[:] = [[], [], val, sort_key]
self._len += 1

def minimum(self):
    return self._extreme_node(LEFT)[VALUE]

def maximum(self):
    return self._extreme_node(RIGHT)[VALUE]

def find(self, sort_key):
    return self._find(sort_key)[VALUE]

def _extreme_node(self, side):
    if not self._root:
        raise IndexError('Empty')
    node = self._root
    while node[side]:
        node = node[side]
    return node

def _find(self, sort_key):
    node = self._root
    while node:
        node_key = node[SORT_KEY]
        if sort_key < node_key:
            node = node[LEFT]
        elif sort_key > node_key:
            node = node[RIGHT]
        else:
            return node
    raise KeyError("%r not found" % sort_key)

ключ сортировки заменяется значением, если таковые имеются.

Ответил 29/04/2013 в 13:25
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more