çalışmıyor python İkili Arama Ağacı

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

i bir ikili arama ağacı uygulamak için yukarıdaki kodu yazdım ama insert yöntemi beklendiği gibi, hatta kök öğeyi eklemek için başarısız çalışmıyor. i nedenini anlamamıza olamaz.

Oluştur 20/06/2010 saat 08:40
kaynak kullanıcı
Diğer dillerde...                            


2 cevaplar

oy
1

Aslında ağaca düğümlerin katamazsın!

Eğer ben aşağıda yaptığımız gördüğümüz gibi onun en kolay, açıkça Kök düğümün ekleyerek yönetmek için insert.

Bir find_placefonksiyon, muhtemelen adından, ebeveyn düğüm döneceğini ve aynı zamanda anahtar için sol veya sağ yuvası olsun? Ben açık bir hale getirdik _do_insertaşağıda fonksiyonu hem yürür ve ekleme yapar.

O andan itibaren, bir dal aşağı recurse eğer, her zaman görmeye ağaç yürümek gerekiyorsa veya yeni düğüm eklemek boş bir yuvaya, ulaştınız mı.

İçine (kaldırır ve bu tür ekler ve yapıyor) ağacı yürüme sorumluluğunu koymak için kodunuzu refactor doğal olabilir Nodesınıfta.

Aşağıdaki kodda, ben ağacın zaten bir anahtarı ekleyerek görmezden, sadece sessizce çıkmak:

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
Cevap 20/06/2010 saat 08:51
kaynak kullanıcı

oy
0

İşte Python ile başka BST Bir sıralama tuşu kullanılarak yapılan

SOL = 0 SAĞ = 1 DEĞER = 2 SORT_KEY = -1

Sınıf BinarySearchTree (nesne):

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

def (kendini, val) insert: hayır sıralama anahtarı, sıralama değeri başka anahtar ise sort_key = val //: self._sort_key Yok eğer 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)

Sıralama anahtar değeri varsa değiştirilir.

Cevap 29/04/2013 saat 13:25
kaynak kullanıcı

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