class Node: def __init__(self, data): self.left = None self.right = None self.data = data def insert(self, data): if data < self.data: # æ åå°äºèç¹ if self.left is None: # å¹¶ä¸å·¦é¢çæ å为空 self.left = Node(data) # å½ä»ä¸è®©çæå ¥ else: # é空çè¯ self.left.insert(data) # 以左æ å为èç¹ç»§ç»æå ¥ elif data > self.data: if self.right is None: self.right = Node(data) else: self.right.insert(data) else: self.data = data def search(self, data, parent=None): ''' dataä¸ºç®æ æ¥è¯¢å¼ï¼åæ¶è¿åparent(ç¶èç¹)便äºå®ä½ã ''' if data < self.data: if self.left is None: return None, None else: return self.left.search(data, self) elif data > self.data: if self.right is None: return None, None return self.right.search(data, self) else: # return self.data, parent.data return self, parent def print_tree_in(self): # ä¸åº if self.left: self.left.print_tree_in() print(self.data) if self.right: self.right.print_tree_in() def print_tree_pre(self): # ååº print(self.data) if self.left: self.left.print_tree_pre() if self.right: self.right.print_tree_pre() def print_tree_post(self): # ååº if self.left: self.left.print_tree_post() if self.right: self.right.print_tree_post() print(self.data) def chrildren(self): count = 0 if self.left: count += 1 if self.right: count += 1 return count def delete(self, data): node, parent = self.search(data) chrildren = node.chrildren() # åèç¹æ°ç® if chrildren == 0: # æ åµ 1ï¼ æ²¡æåèç¹ï¼ç´æ¥å é¤å³å¯ if parent.left is node: # å¤æç®æ èç¹æ¯å ¶ç¶èç¹ç å·¦orå³ èç¹ parent.left = None else: parent.right = None del node elif chrildren == 1: # æ åµ 2ï¼ æä¸ä¸ªåèç¹ï¼ç¨åèç¹æ¿æ¢å ¶å³å¯ if node.left: tmp = node.left else: tmp = node.right if parent: if parent.left is node: parent.left = tmp else: parent.right = tmp del node else: ''' 第ä¸ç§æ 嵿¯è¾å¤æï¼ 1. å·¦èç¹0个åèç¹ 2. å·¦èç¹1个åèç¹ 3. å·¦èç¹2个åèç¹ ''' parent = node successor = node.right while successor.left: # é彿æ³ï¼ç´è³æ¾å°æå·¦çåèç¹ï¼ ä¿ææ ç平衡ï¼ç¨å³åèç¹ç弿¿æ¢ parent = successor successor = successor.left node.data = successor.data if parent.left == successor: parent.left = successor.right else: parent.right = successor.right # æ¥ä¸æ¥å¯ä»¥æµè¯ä»¥ä¸ç§çæ æä¹æ ·å¦ã root = Node(11) root.insert(14) root.insert(9) root.insert(9) root.insert(7) root.insert(10) root.insert(4) root.insert(5) root.insert(6) root.insert(8) value, parent = root.search(10) print(value.data, parent.data) root.print_tree_in() print('*' * 20) root.delete(4) root.print_tree_in()