zoukankan      html  css  js  c++  java
  • Python 关于二叉树生成、先序遍历、中序遍历、后序遍历、反转

    class Node:
        def __init__(self, data, left=None, right=None):
            self.data, self.left, self.right = data, left, right
    
    
    class BinTree:
        def __init__(self, root=None):
            self.root = root
            self.callback = []
    
        @classmethod
        def build_from(cls, node_list):
            """通过节点信息构造二叉树
            第一次遍历我们构造 node 节点
            第二次遍历我们给 root 和 孩子赋值
    
            :param node_list: {'data': 'A', 'left': None, 'right': None, 'is_root': False}
            """
            node_dict = {}
            root = None
            for node_data in node_list:
                node_dict[node_data['data']] = Node(node_data['data'])  # 所有节点写入节点字典中
            for node_data in node_list:
                data = node_data['data']
                node = node_dict[data]  # node_dict = {'A':Node('A')}
                if node_data['is_root']:
                    root = node
                node.left = node_dict.get(node_data['left'])  # Node('A').left = Node('B') else None
                node.right = node_dict.get(node_data['right'])
            return cls(root)
    
        def preorder_traverse(self, subtree):
            '''
            先(根)序遍历
            :param subtree:
            :return:
            '''
    
            if subtree is not None:  # 该节点没有子节点就停止
                print(subtree.data)
                self.preorder_traverse(subtree.left)
                self.preorder_traverse(subtree.right)
    
        def midorder_traverse(self, subtree):
            '''
            中(根)序遍历
            :param subtree:
            :return:
            '''
            if subtree is not None:
                self.midorder_traverse(subtree.left)
                print(subtree.data)
                self.midorder_traverse(subtree.right)
    
        def lastorder_traverse(self, subtree):
            '''
            后(根)序遍历
            :param subtree:
            :return:
            '''
            if subtree is not None:
                self.lastorder_traverse(subtree.left)
                self.lastorder_traverse(subtree.right)
                self.callback.append(subtree.data)
    
        def reverse(self, subtree):
            if subtree is not None:
                subtree.left, subtree.right = subtree.right, subtree.left
                self.reverse(subtree.left)
                self.reverse(subtree.right)
    
    
    node_list = [
        {'data': 'A', 'left': 'B', 'right': 'C', 'is_root': True},
        {'data': 'B', 'left': 'D', 'right': 'E', 'is_root': False},
        {'data': 'D', 'left': None, 'right': None, 'is_root': False},
        {'data': 'E', 'left': 'H', 'right': None, 'is_root': False},
        {'data': 'H', 'left': None, 'right': None, 'is_root': False},
        {'data': 'C', 'left': 'F', 'right': 'G', 'is_root': False},
        {'data': 'F', 'left': None, 'right': None, 'is_root': False},
        {'data': 'G', 'left': 'I', 'right': 'J', 'is_root': False},
        {'data': 'I', 'left': None, 'right': None, 'is_root': False},
        {'data': 'J', 'left': None, 'right': None, 'is_root': False},
    ]
    
    
    def tree(node_list):
        nodes = {}
        datas = []
        root = None
        for nodedata in node_list:
            data = nodedata['data']
            left = nodedata['left']
            right = nodedata['right']
            nodes[data] = Node(data, left, right)
            datas.append(data)
            # 所有节点均有了,nodes= {'A':Node('A'),'B':Node('B')}
            # Node('A'):{'data':'A',left:'B',right:'C'}
        for nodedata in node_list:
            data = nodedata['data']  # 'A','B','C'
            node = nodes[data]
            if nodedata['is_root']:
                root = node
            try:
                node.left = nodes[node.left]
            except KeyError:
                node.left = None
            node.right = nodes.get(nodedata['right'])
    
        return root
    
    
    if __name__ == '__main__':
        btree = BinTree.build_from(node_list)
        # btree.preorder_traverse(btree.root)  # 输出 A, B, D, E, H, C, F, G, I, J
        # btree.midorder_traverse(btree.root)
        btree.lastorder_traverse(btree.root)
        print(btree.callback)
        btree.reverse(btree.root)
        print(btree.root)
  • 相关阅读:
    tableau用户留存分析
    tableau用户分类
    业务
    数据分析的思维技巧-二
    数据分析的思维技巧
    业务化思维
    公式化思维
    结构化思维
    Shortest Unsorted Continuous Subarray
    Longest Harmonious Subsequence
  • 原文地址:https://www.cnblogs.com/ceshixuexi/p/9525594.html
Copyright © 2011-2022 走看看