Binary Search Baum in Python nicht funktioniert

stimmen
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'''

Ich schrieb den obigen Code einen binären Suchbaum zu implementieren, aber der Einsatz Methode funktioniert nicht wie erwartet, es auch das Wurzelelement hinzufügen ausfällt. Ich kann nicht die Ursache undestand.

Veröffentlicht am 20/06/2010 um 08:40
quelle vom benutzer
In anderen Sprachen...                            


2 antworten

stimmen
1

Du fügst eigentlich keine Knoten in den Baum!

Seine einfachste ausdrücklich die Zugabe des Root - Knotens zu verwalten, wie Sie sehe ich in der unten tat insert.

Eine find_placeFunktion würde, vermutlich aus dem Namen, geben Sie den übergeordneten Knoten und auch ob es sich um die linke oder rechte Schlitz für den Schlüssel? Ich habe eine explizite gemacht _do_insertFunktion unten , dass sowohl geht und tut den Einsatz.

Von nun an müssen Sie den Baum, jedes Mal zu sehen, gehen, wenn Sie einen Zweig Rekursion oder ob Sie haben einen leeren Platz erreicht, in dem Sie den neuen Knoten hinzuzufügen.

Es könnte natürlich sein , Ihren Code Refactoring Verantwortung zu setzen , um den Baum zu Fuß (und tun fügt hinzu, entfernt und so weiter ) in die NodeKlasse.

In dem folgenden Code, ich ignoriere das Hinzufügen einen Schlüssel, der bereits in dem Baum ist, ich verlassen nur leise:

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
Beantwortet am 20/06/2010 um 08:51
quelle vom benutzer

stimmen
0

Hier ist ein weiteres BST mit Python, eine Sortierschlüssel

LINKS = 0 RECHTS = 1 VALUE = 2 sort_key = -1

Klasse BinarySearchTree (object):

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

def (self, val) einfügen: wenn self._sort_key ist None: sort_key = val // Wenn keine Sortierschlüssel, Sortierschlüssel Wert ist anders: 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)

Sortierschlüssel wird durch Wert falls ersetzt.

Beantwortet am 29/04/2013 um 13:25
quelle vom benutzer

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