Binary Search Tree στην 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συνάρτηση παρακάτω ότι και οι δύο περιπάτους και κάνει το ένθετο.

Από κει και πέρα, θα πρέπει να περπατήσετε το δέντρο, κάθε φορά που βλέπει εάν recurse κάτω από ένα κλαδί ή αν έχετε φτάσει σε μια κενή υποδοχή, όπου μπορείτε να προσθέσετε το νέο κόμβο.

Θα μπορούσε να είναι φυσικό να refactor τον κωδικό σας για να βάλετε την ευθύνη για το περπάτημα το δέντρο (και κάνει προσθέτει, αφαιρεί και τέτοια) στην 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

class BinarySearchTree (αντικείμενο):

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

def ένθετο (self, val): αν self._sort_key είναι None: sort_key = val // αν δεν κλειδί είδος, το είδος κλειδί είναι τιμή αλλού: 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)

κλειδί Ταξινόμηση αντικαθίσταται από την αξία αν υπάρχουν.

Απαντήθηκε 29/04/2013 στις 13:25
πηγή χρήστη

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