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

本文介绍了树的基本概念,包括父节点、子节点、叶子节点等,重点探讨了二叉树的特性,如节点深度、高度、宽度和大小。讨论了满二叉树、完美二叉树和完全二叉树的区别,并详细阐述了二叉树的表示方法及三种主要遍历方式:先序、中序和后序遍历。这些概念和操作揭示了二叉树作为递归结构的本质。
摘要由CSDN通过智能技术生成

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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值