二叉搜索树 Python版
二叉搜索树是红黑树前置技能,所以还是先花点时间写了写啦,本二叉搜索树为左小右大型。
一天一个python小技巧:
- 函数名或变量名前加__代表私有
- 整个字典的更新不能直接赋值,要用 update
class BinarySearchTreeDict(object):
def __init__(self):
self.tree = {}
# 插入元素 ——————————————————————————————
def insert(self, val):
self.__insert(self.tree, val)
def __insert(self, t, val):
if not t:
t['num'] = val
t['left'] = {}
t['right'] = {}
elif t['num'] >= val:
self.__insert(t['left'], val)
elif t['num'] < val:
self.__insert(t['right'], val)
# 删除元素 ——————————————————————————————
# 1.叶子节点:直接删除即可
# 2.只有左子树或右子树:将子树提上来
# 3.左右子树都有:将左子树里最大的点提上来,若最大点也有左子树,则将最大点的左子树替换最大点
def cancel(self, val):
return "删除" + str(val) + str(" : ") + str(self.__cancel(self.tree, val))
def __cancel(self, t, val):
if t:
if t['num'] == val:
if t['left'] and t['right']:
print("有左右子树")
t2 = t['left']
while t2['right']:
t2 = t2['right']
t['num'] = t2['num']
if t2['left']:
print("最大点有左子树")
t2.update(t2['left'])
else:
t2.clear()
elif not t['left'] and t['right']:
print("只有右子树")
t['num'] = t['right']['num']
t['left'] = t['right']['left']
t['right'] = t['right']['right']
elif t['left'] and not t['right']:
print("只有左子树")
t['num'] = t['left']['num']
t['right'] = t['left']['right']
t['left'] = t['left']['left']
else:
print("叶子节点")
t.clear()
return True
elif t['num'] > val:
return self.__cancel(t['left'], val)
elif t['num'] < val:
return self.__cancel(t['right'], val)
else:
return False
# 查找元素 ——————————————————————————————
def find(self, val):
return "是否存在" + str(val) + str(" : ") + str(self.__find(self.tree, val))
def __find(self, t, val):
if t:
if t['num'] == val:
return True
elif t['num'] > val:
return self.__find(t['left'], val)
elif t['num'] < val:
return self.__find(t['right'], val)
else:
return False
# 输出整树 ——————————————————————————————
# N代表不存在该点
def show_list(self):
# 列表输出
print("Show List TREE")
stack = [self.tree, 0]
show = []
while stack:
index = stack.pop()
t = stack.pop()
while len(show) < index+1:
show.append([])
if t:
show[index].append(t['num'])
arr = []
if t['left']:
arr.append(t['left']['num'])
else:
arr.append('N')
if t['right']:
arr.append(t['right']['num'])
else:
arr.append('N')
show[index].append(arr)
stack.append(t['right'])
stack.append(index+1)
stack.append(t['left'])
stack.append(index+1)
for i in show:
if i:
print(i)
def show_tree(self, my_sum=15):
# 树形输出
太难搞了orz,有空再写

浙公网安备 33010602011771号