Binární vyhledávací strom v pythonu nefunguje

hlasů
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'''

jsem napsal výše uvedený kód implementovat binární vyhledávací strom, ale metoda vložka nefunguje, jak se očekávalo, se nezdaří přidat i kořenový element. Nemohu undestand příčinu.

Položena 20/06/2010 v 08:40
zdroj uživatelem
V jiných jazycích...                            


2 odpovědí

hlasů
1

Nejste ve skutečnosti přidat nějaké uzlů do stromu!

Jeho nejjednodušší řídit přidávání kořenový uzel explicitně, jak vidíte jsem udělal níže v části insert.

find_placeFunkce by pravděpodobně z názvu, vrátí nadřazený uzel a také to, zda je to levý nebo pravý slot pro klíč? Udělal jsem explicitní _do_insertfunkce nižší, než jak chodí a dělá vložku.

Od té doby, budete muset jít na strom, pokaždé, když vidí, když se recurse dolů pobočku, nebo zda jste dosáhli na prázdnou pozici, kde si přidat nový uzel.

Mohlo by to být přirozené refaktorovat kód dát zodpovědnost za chůze stromu (a tím přidává, odebírá a jako) do Nodetřídy.

V níže uvedeném kódu, pominu přidáním klíče, který je již ve stromu, já jen tiše ukončit:

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
Odpovězeno 20/06/2010 v 08:51
zdroj uživatelem

hlasů
0

Zde je další BST s Python, s použitím třídění klíče

Doleva = 0 vpravo = 1 HODNOTA = 2 SORT_KEY = -1

třída BinarySearchTree (objekt):

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

def vložka (self, val): Je-li self._sort_key je None: sort_key = val // není-li řadící klíč, řadící klíč je hodnota else: sort_key = self._sort_key (val)

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)

Řadit klíč je nahrazen hodnotou, pokud existuje.

Odpovězeno 29/04/2013 v 13:25
zdroj uživatelem

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