python算法与数据结构(18)树与二叉树

tree 父节点,儿子节点,兄弟节点,子树,叶子节点(没有子节点的节点)。
二叉树,节点深度,树的高度(节点深度+1),树的宽度(最多节点的层级的节点数),数的size(二叉树的节点总个数)。
满二叉树 :每个非叶子节点包含两个数。
完美二叉树
完全二叉树

二叉树的表示

二叉树的遍历
二叉树是一种递归结构,单独一个subtree出来,它还是一棵树,
先序遍历: 先处理根,之后左子树,然后右子树
中序遍历: 先处理左子树,然后根,最后是右子树
后续遍历:先处理左子树,然后右子树,最后是根

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},
]


class BinTreeNode(object):
    def __init__(self, data, left=None, right=None):
        self.data, self.left, self.right = data, left, right


class BinTree(object):
    def __init__(self, root=None):
        self.root = root

    @classmethod
    def build_form(cls, node_list):
        """通过节点信息构造二叉树
        两次遍历,第一次遍历构造node节点
        第二次遍历给root和孩子赋值
        最后我们用root初始化这个类并返回一个对象
        """
        node_dict = {}
        for node_data in node_list:
            data = node_data["data"]
            node_dict[data] = BinTreeNode(data)
        for node_data in node_list:
            data = node_data['data']
            node = node_dict[data]
            if node_data['is_root']:
                root = node
            node.left = node_dict.get(node_data['left'])
            node.right = node_dict.get(node_data['right'])
        return cls(root)

    def preorder_trav(self, subtree):
        """先序遍历"""
        if subtree is not None:
            print(subtree.data)
            self.preorder_trav(subtree.left)
            self.preorder_trav(subtree.right)


btree = BinTree.build_form(node_list)
btree.preorder_trav(btree.root)

发布了48 篇原创文章 · 获赞 0 · 访问量 743

猜你喜欢

转载自blog.csdn.net/qq_36710311/article/details/104707375