1 # encoding=utf-8 2 3 4 class BSTree: 5 """ 6 二叉搜索树 7 """ 8 middle_list = [] 9 10 class Node: 11 def __init__(self, ele): 12 self.data = ele 13 self.left_child = None 14 self.right_child = None 15 16 def __str__(self): 17 return str(self.data) 18 19 def __lt__(self, other): 20 return self.data < other.data 21 22 def __gt__(self, other): 23 return self.data > other.data 24 25 def __eq__(self, other): 26 return self.data == other.data 27 28 def __init__(self, ele): 29 self.__root = self.Node(ele) 30 31 @property 32 def root(self): 33 """ 34 返回根节点 35 :return: self.__root 36 """ 37 return self.__root 38 39 def insert(self, ele): 40 """ 41 插入到排序的位置 42 :param ele: element 43 :return: 44 """ 45 ele = self.Node(ele) 46 _root = self.find_ele(ele, self.__root) 47 if _root > ele: 48 # insert to left 49 _root.left_child = ele 50 elif _root < ele: 51 # insert to right 52 _root.right_child = ele 53 else: 54 # 节点已存在 55 pass 56 57 def find_ele(self, ele, _root): 58 """ 59 查找ele应该挂载的节点, ele将插入在节点的left/right 60 :param ele: element type of BSTree.Node 61 :param _root: 当前用来排序的根节点 62 :return: 应插入的根节点& left 1/right 0 63 """ 64 """ 65 while _root < ele: 66 # 走右节点, 一直到节点值大于ele,此时节点值>ele, 如无左节点 ele挂载到它的左节点, 有左节点递归左节点 67 if _root.right_child: 68 _root = _root.right_child 69 else: 70 break 71 while _root > ele: 72 # 走左节点, 一直到节点值小于ele, 此时节点值<ele, 如无右节点 ele挂载到它的右节点, 有右节点递归右节点 73 if _root.left_child: 74 _root = _root.left_child 75 else: 76 break 77 """ 78 79 while _root < ele and _root.right_child: 80 # 走右节点, 一直到节点值大于ele,此时节点值>ele, 如无左节点 ele挂载到它的左节点, 有左节点递归左节点 81 _root = _root.right_child 82 while _root > ele and _root.left_child: 83 # 走左节点, 一直到节点值小于ele, 此时节点值<ele, 如无右节点 ele挂载到它的右节点, 有右节点递归右节点 84 _root = _root.left_child 85 86 if _root.left_child and _root > ele: 87 # 对应 while _root < ele 如有左节点递归左节点 88 return self.find_ele(ele, _root.left_child) 89 if _root.right_child and _root < ele: 90 # 对应 while _root > ele 如有右节点递归右节点 91 return self.find_ele(ele, _root.right_child) 92 return _root 93 94 def search(self, ele): 95 """ 96 元素是否存在于树中 97 :param ele: type of element 98 :return: 99 """ 100 ele = self.Node(ele) 101 node = self.find_ele(ele, self.__root) 102 return ele == node 103 104 def middle_order_wrapper(func): 105 """ 106 中序遍历装饰器 107 :return: 108 """ 109 def inner(self, __root): 110 func(self, __root) 111 return self.middle_list 112 return inner 113 114 """ 115 @middle_order_wrapper 116 def middle_order(self, __root): 117 if not __root: 118 return 119 self.middle_order(__root.left_child) 120 self.middle_list.append(__root) 121 self.middle_order(__root.right_child) 122 """ 123 124 def middle_order(self, __root): 125 """中序遍历 仅打印测试""" 126 if not __root: 127 return 128 self.middle_order(__root.left_child) 129 print __root 130 self.middle_order(__root.right_child) 131 132 def min(self, _root): 133 """ 134 if _root.left_child: 135 return self.min(_root.left_child) 136 else: 137 return _root 138 """ 139 while _root.left_child: 140 _root = _root.left_child 141 return _root 142 143 def max(self, _root): 144 """ 145 if _root.right_child: 146 return self.max(_root.right_child) 147 else: 148 return _root 149 """ 150 while _root.right_child: 151 _root = _root.right_child 152 return _root 153 154 def del_node(self, _root, ele): 155 """ 156 删除 157 :param _root: 根节点 158 :param ele: type of Tree.Node 159 :return: node 160 """ 161 if _root > ele: 162 _root.left_child = self.del_node(_root.left_child, ele) 163 if _root < ele: 164 _root.right_child = self.del_node(_root.right_child, ele) 165 else: 166 # 删除时, 分为三种情况:只有左子树或者只有右子树、有左右子树、即无左子树又无右子树 167 if _root.left_child and _root.right_child: 168 # 既有左子树又有右子树,则需找到右子树中最小值节点 赋值给_root, 再把右子树中最小值节点删除 169 _min = self.min(_root.right_child) 170 _root.data = _min.data 171 _root.right_child = self.del_node(_root.right_child, _min) 172 elif not _root.right_child and not _root.left_child: 173 # 左右子树都为空, 直接删除 174 _root = None 175 elif not _root.right_child: 176 # 只有左子树 177 _root = _root.left_child 178 elif not _root.left_child: 179 # 只有右子树 180 _root = _root.right_child 181 return _root
晚上刷牙的时候, 左右左右, 突然想明白的.
如果是自定义类型, 需要实现__lt__() & __gt()__ & __eq__ 等比较运算的方法
浙公网安备 33010602011771号