二叉搜索树 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,有空再写
posted @ 2021-04-23 17:32  一语子  阅读(138)  评论(0)    收藏  举报