Binarne drzewo poszukiwań w Pythonie nie działa

głosy
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'''

Napisałem powyższy kod zaimplementować przeszukiwania binarnego drzewa ale metoda wkładka nie działa zgodnie z oczekiwaniami, to nie dodać jeszcze element główny. Nie mogę undestand przyczynę.

Utwórz 20/06/2010 o 08:40
źródło użytkownik
W innych językach...                            


2 odpowiedzi

głosy
1

Nie jesteś rzeczywiście dodawania węzłów do drzewa!

Jego najłatwiej zarządzać dodanie węzła głównego wyraźnie, jak widać zrobiłem poniżej w insert.

find_placeFunkcja będzie przypuszczalnie od nazwy, powrót węzeł nadrzędny, a także czy jest to w lewo lub prawo gniazdo na klucz? Zrobiłem wyraźną _do_insertfunkcję poniżej, że zarówno spacery i nie wkładkę.

Od tego czasu, trzeba iść na drzewo, za każdym razem widząc jeśli rekursja dół oddział lub czy został osiągnięty puste miejsce, gdzie można dodać nowy węzeł.

Może to być naturalne byłaby kod, aby umieścić odpowiedzialność za chodzenie drzewa (i robi dodaje, usuwa i takie) do Nodeklasy.

W poniższym kodzie, ignoruję dodanie klucza, który jest już w drzewie, po prostu cicho wyjść:

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
Odpowiedział 20/06/2010 o 08:51
źródło użytkownik

głosy
0

Oto kolejny BST z Pythonie, używając klucza sortowania

Prawy lewy = 0 WARTOŚĆ = 1 = 2 = -1 SORT_KEY

Klasa BinarySearchTree (obiekt):

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

def wstawić (self, Val): jeśli self._sort_key jest None: sort_key = val // jeżeli żaden przycisk sortowania, sortowanie kluczem jest wartość 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)

Sortuj klucz został zastąpiony przez wartość, jeśli takie istnieją.

Odpowiedział 29/04/2013 o 13:25
źródło użytkownik

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