Badamy obiektową implementację drzewa poszukiwań binarnych z klasą BinarySearchTree.
class Node: """Klasa reprezentująca węzeł drzewa binarnego.""" def __init__(self, data=None, left=None, right=None): self.data = data self.left = left self.right = right def __str__(self): return str(self.data) def insert(self, node): if node.data < self.data: # mniejsze na lewo if self.left: self.left.insert(node) else: self.left = node else: # większe lub równe na prawo if self.right: self.right.insert(node) else: self.right = node def count(self): counter = 1 if self.left: counter += self.left.count() if self.right: counter += self.right.count() return counter def search(self, data): if self.data == data: return self if data < self.data: if self.left: return self.left.search(data) else: if self.right: return self.right.search(data) return None def remove(self, data): # self na pewno istnieje # Są lepsze sposoby na usuwanie. if data < self.data: if self.left: self.left = self.left.remove(data) elif self.data < data: if self.right: self.right = self.right.remove(data) else: # self.data == data if self.left is None: # przeskakuje self return self.right else: # self.left na pewno niepuste # Szukamy największego w lewym poddrzewie. node = self.left while node.right: # schodzimy w dół node = node.right node.right = self.right # przyczepiamy return self.left return self
class BinarySearchTree: """Klasa reprezentująca binarne drzewo poszukiwań.""" def __init__(self): self.root = None def insert(self, node): if self.root: self.root.insert(node) else: self.root = node def count(self): if self.root: return self.root.count() else: return 0 def search(self, data): # zwraca node lub None if self.root: return self.root.search(data) else: return None def remove(self, data): if self.root: self.root = self.root.remove(data)
Można rozważyć inną implementację drzewa BST, w której klasa Node ma tylko metody __init__ i __str__, a cała praca jest przeniesiona do metod w klasie BinarySearchTree.
class Node: """Klasa reprezentująca węzeł drzewa binarnego.""" def __init__(self, data=None, left=None, right=None): self.data = data self.left = left self.right = right def __str__(self): return str(self.data) class BinarySearchTree: """Klasa reprezentująca binarne drzewo poszukiwań.""" pass