二叉樹和二叉搜尋樹
阿新 • • 發佈:2021-08-10
二叉樹遍歷
class Bitree: def __init__(self, data): self.data = data self.lchild = None self.rchild = None a = Bitree('A') b = Bitree('B') c = Bitree('C') d = Bitree('D') e = Bitree('E') f = Bitree('F') g = Bitree('G') e.lchild = a e.rchild = g a.rchild = c c.lchild = b c.rchild = d g.rchild = f root = e # 前序遍歷 def per_order(tree): if tree: print(tree.data, end=',') per_order(tree.lchild) per_order(tree.rchild) # per_order(root) # E,A,C,B,D,G,F, # 後序遍歷 def post_order(tree): if tree: post_order(tree.lchild) post_order(tree.rchild) print(tree.data, end=',') post_order(root) # B,D,C,A,F,G,E, #層次查詢 from collections import deque def leve_order(tree): queue = deque queue.append(tree) while len(queue) > 0: node = queue.popleft() print(node.data, end=',') if node.lchild: queue.append(node.lchild) if node.rchild: queue.append(node.rchild)
二叉搜尋樹
二叉搜尋樹是二叉樹滿足以下性質:
如果y是x的左子節點,則有y.key<=x.key;
如果y是x的右子節點,則有y.key>=x.key;
class BistreeNode: def __init__(self, data): self.data = data self.lchild = None self.rchild = None self.parent = None class BST: def __init__(self, li): self.root = None if li: for i in li: self.insert_no_Recursive(i) def insert_no_Recursive(self, val): if not self.root: self.root = BistreeNode(val) p = self.root while True: # 如果插入的值小於當前節點的值,那麼就判斷 # 如果有左子節點,就往當前節點的左子節點上跳,如果沒有就把要插入的值放到當前節點的左子節點上 if val < p.data: if p.lchild: p = p.lchild else: p.lchild = BistreeNode(val) p.lchild.parent = p return elif val > p.data: if p.rchild: p = p.rchild else: p.rchild = BistreeNode(val) p.rchild.parent = p return else: return def insert_recursive(self, node, val): if not node: node = BistreeNode(val) if val < node.data: node.lchild = self.insert_recursive(node.lchild, val) node.lchild.parent = node elif val > node.data: node.rchild = self.insert_recursive(node.rchild, val) node.rchild.parent = node return node # 前序遍歷 def per_order(self, tree): if tree: print(tree.data, end=',') self.per_order(tree.lchild) self.per_order(tree.rchild) # 後序遍歷 def post_order(self, tree): if tree: self.post_order(tree.lchild) self.post_order(tree.rchild) print(tree.data, end=',') # 中序遍歷 def mid_order(self,tree): if tree: self.mid_order(tree.lchild) print(tree.data, end=',') self.mid_order(tree.rchild) def query(self, node, val): if not node: return False if node.data < val: return self.query(node.rchild, val) elif node.data > val: return self.query(node.lchild, val) else: return node def query_no_recursiive(self, node, val): if not node: return False while True: if node.data < val: if node.rchild: node = node.rchild else: raise ValueError('val is not exist') elif node.data > val: if node.lchild: node = node.lchild else: raise ValueError('val is not exist') else: return node def __remove_node_1(self, node): # 要刪除的節點是葉子節點 if not node.parent: self.root = None if node.parent.lchild and node == node.parent.lchild: node.parent.lchild = None else: node.parent.rchild = None def __remove_node_21(self, node): # 只有一個左葉子節點 if not node.parent: self.root = node.lchild node.lchild.parent = None # 如果它是父節點的 左子節點 elif node == node.parent.lchild: node.parent.lchild = node.lchild node.lchild.parent = node.parent # 如果它是父節點的 右子節點 else: node.parent.rchild = node.lchild node.lchild.parent = node.parent def __remove_node_22(self, node): # 只有一個右葉子節點 if not node.parent: self.root = node.rchild node.rchild.parent = None elif node == node.parent.rchild: node.parent.rchild = node.rchild node.rchild.parent = node.parent else: node.parent.lchild = node.rchild node.rchild.parent = node.parent def delete(self, val): if self.root: node = self.query_no_recursiive(self.root, val) if not node: return False if not node.lchild and not node.rchild: self.__remove_node_1(node) elif not node.lchild: self.__remove_node_22(node) elif not node.rchild: self.__remove_node_21(node) else: min_node = node.lchild while min_node.lchild: min_node = min_node.lchild node.data = min_node.data if not min_node.rchild: self.__remove_node_21(min_node) else: self.__remove_node_1(min_node) bst = BST([4,5,9,7,2,1,3,4,2,7,8]) bst.insert_recursive(bst.root, 0) # print(bst.per_order(bst.root)) bst.per_order(bst.root) # print(bst.query(bst.root, 5).data) bst.delete(3) print('') bst.mid_order(bst.root)