zoukankan      html  css  js  c++  java
  • 二叉树

    # 中序遍历
    def in_order_tree_walk(node):
        if node is not None:
            in_order_tree_walk(node.leftChild)
            print(node.value, end=" ")
            in_order_tree_walk(node.rightChild)
    
    
    def pre_order_tree_walk(node):
        if node:
            print(node.value, node.color)
            pre_order_tree_walk(node.leftChild)
            pre_order_tree_walk(node.rightChild)
    
    
    # 最小关键字元素
    def tree_minimum(node):
        while node.leftChild:
            node = node.leftChild
        return node
    
    
    def tree_maximum(node):
        temp_node = node
        while temp_node.rightChild:
            temp_node = temp_node.rightChild
        return temp_node
    
    
    # 后继
    def tree_successor(node):
        if node.rightChild:
            return tree_minimum(node.rightChild)
        # 如果指定结点的右子树为空
        up_node = node.parent
        while up_node and node == up_node.rightChild:
            node = up_node
            up_node = up_node.parent
        return up_node
    
    
    # 前驱
    def tree_predecessor(node):
        if node.leftChild:
            return tree_maximum(node.leftChild)
        up_node = node.parent
        while up_node and node == up_node.leftChild:
            node = up_node
            up_node = up_node.parent
        return up_node
    
    
    def transplant(tree, node_u, node_v):
        if not node_u.parent:
            tree.root = node_v
        elif node_u == node_u.parent.leftChild:
            node_u.parent.leftChild = node_v
        elif node_u == node_u.parent.rightChild:
            node_u.parent.rightChild = node_v
        if node_v:
            node_v.parent = node_u.parent
    
    
    class TreeNode:
        def __init__(self, value, left=None, right=None, parent=None):
            self.value = value
            self.parent = parent
            self.leftChild = left
            self.rightChild = right
    
    
    class Tree:
        def __init__(self, root=None):
            self.root = root
    
        # 二叉树查找
        def tree_search(self, search_value, node):
            if node.value is None or search_value == node.value:
                return node
            if search_value < node.value:
                return self.tree_search(search_value, node.leftChild)
            else:
                return self.tree_search(search_value, node.rightChild)
    
        def tree_search_02(self, search_value, node):
            while node and search_value != node.value:
                if search_value < node.value:
                    node = node.leftChild
                else:
                    node = node.rightChild
            return node
    
        # 插入
        def tree_insert(self, insert_node):
            parent_node = None
            r = self.root
            while r is not None:
                parent_node = r
                if insert_node.value < r.value:
                    r = r.leftChild
                else:
                    r = r.rightChild
            insert_node.parent = parent_node
            if parent_node is None:
                self.root = insert_node
            elif insert_node.value < parent_node.value:
                parent_node.leftChild = insert_node
            else:
                parent_node.rightChild = insert_node
    
        # 删除
    
        def tree_delete(self, delete_node):
            if delete_node.leftChild is None:
                transplant(self, delete_node, delete_node.rightChild)
            elif delete_node.rightChild is None:
                transplant(self, delete_node, delete_node.leftChild)
            else:
                y = tree_minimum(delete_node.rightChild)
                if y.parent != delete_node:
                    transplant(self, y, y.rightChild)
                    y.rightChild = delete_node.rightChild
                    y.rightChild.parent = y
                transplant(self, delete_node, y)
                y.leftChild = delete_node.leftChild
                y.leftChild.parent = y
    
    
    if __name__ == '__main__':
        # 构建二叉树++++++++++++++++上界+++++++++++++++++
        node_4 = TreeNode(4)
        node_11 = TreeNode(11)
        node_30 = TreeNode(30)
        node_40 = TreeNode(40)
        node_52 = TreeNode(52)
        node_61 = TreeNode(61)
        node_82 = TreeNode(82)
        node_95 = TreeNode(95)
        node_10 = TreeNode(10, node_4, node_11)
        node_33 = TreeNode(33, node_30, node_40)
        node_56 = TreeNode(56, node_52, node_61)
        node_89 = TreeNode(89, node_82, node_95)
        node_25 = TreeNode(25, node_10, node_33)
        node_75 = TreeNode(75, node_56, node_89)
        node_50 = TreeNode(50, node_25, node_75)
    
        node_4.parent = node_10
        node_11.parent = node_10
        node_30.parent = node_33
        node_40.parent = node_33
        node_52.parent = node_56
        node_61.parent = node_56
        node_82.parent = node_89
        node_95.parent = node_89
        node_10.parent = node_25
        node_33.parent = node_25
        node_56.parent = node_75
        node_89.parent = node_75
        node_25.parent = node_50
        node_75.parent = node_50
        # 构建二叉树+++++++++++++++++下界+++++++++++++++++
    
        T = Tree(node_50)
        in_order_tree_walk(node_50)
        print()
    
        search_res01 = T.tree_search(33, T.root)
        print(search_res01, search_res01.value)
    
        search_res02 = T.tree_search_02(33, T.root)
        print(search_res02, search_res02.value)
    
        mini = tree_minimum(node_50)
        print(mini, mini.value)
        maxi = tree_maximum(node_50)
        print(maxi, maxi.value)
    
        # successor = tree_successor(node_30)
        # print(successor, successor.value)
        # predecessor = tree_predecessor(node_30)
        # print(predecessor, predecessor.value)
    
        node_77 = TreeNode(77)
        T.tree_insert(node_77)
        in_order_tree_walk(node_50)
        print()
        T.tree_delete(node_56)
        T.tree_delete(node_77)
        in_order_tree_walk(node_50)
  • 相关阅读:
    Spark:大数据的“电光石火”
    Android开发-取消程序标题栏或自定义标题栏
    Android中实现圆角矩形及半透明效果。
    Android中设定背景图片平铺。
    收到的电邮附件为Winmail.dat?
    Runas命令:能让域用户/普通User用户以管理员身份运行指定程序。
    AD域服务器|两台DC无法进行复制同步
    IIS服务器运行一段时间后卡死,且无法打开网站(IIS管理无响应,必须重启电脑)
    Outlook不能打开附件(提示:无法创建文件xx,请右键单击要在其中创建文件的文件夹..)
    点击自动显示/隐藏DIV代码。(简单实用)
  • 原文地址:https://www.cnblogs.com/glz666/p/14170675.html
Copyright © 2011-2022 走看看