[python]树操作(持续更新中)

Ctrl+f搜关键词,搜不到找其他博客,下面肯定没有

节点的度: 一个节点含有的子树的个数(即子节点的个数)

树的度: 树中所有节点的度的最大值(即子节点最大的个数)

叶节点: 度为0的节点

子节点: 一个节点含有的子树的根节点称为该节点的子节点

父节点: 若一个节点有子节点,那么这个节点就是其子节点的父节点

兄弟节点: 具有相同父节点的节点互称兄弟节点

堂兄弟节点: 在同一层的节点互称堂兄弟节点

祖先节点: 从根到该节点所经路径上的所有节点

子孙节点: 以某节点为根的子树中的所有节点

节点层次: 根节点层次为1,其他节点层次是父节点的层次加1

树的深度: 树中所有节点的层次的最大值

森林: 多颗不相交的树的集合

二叉树: 每个节点最多含有两个子树的树称为二叉树

完全二叉树: 除了最底层外,其他各层的节点数目均达到最大值,且最底层的节点应从左往右紧密排列

满二叉树: 所有叶节点都在最底层的完全二叉树

二叉搜索树: 对于一个节点,它的左子树上的所有节点的值都比它小,右子树上的所有节点的值都比它大

顺序存储: 从上往下,从左往右的将树存到顺序表中
优点: 遍历方便,可以用索引来表示节点间的关系
缺点: 可能会对存储空间造成极大的浪费
适用于存完全二叉树

链式存储: 每个节点具有 左指针域, 数据域, 右指针域, 以此来连接.

便历
先序遍历

根节点->左子树->右子树

中序遍历

左子树->根节点->右子树

后序遍历

左子树->右子树->根节点

class Node:
    def __init__(self, val):
        self.val = val  # 数据域
        self.left = None  # 左指针域
        self.right = None  # 右指针域


class Tree:
    def __init__(self):
        self.root = None  # 树的根节点

    def add(self, val):
        # 层次遍历, 广度优先遍历
        # val 要添加的节点的值
        # 往树中添加一个节点,并保证添加之后这棵树依旧是一棵完全二叉树
        node = Node(val)
        # 判断树是否为空,如果为空,直接将node设置为根节点
        if not self.root:
            self.root = node
            return
        # 从上往下,从左往右的去遍历整棵树,然后找到第一个空位
        # 把节点添加进去
        queue = [self.root]  # 存每一层的节点
        while True:
            # 第一次 queue = [root]
            # 第二次 queue = [root.left, root.right]
            # queue = [root.right, root.left.left, root.left.right]
            # queue = [root.left.left, root.left.right, root.right.left, root.right.right]
            cur_node = queue.pop(0)
            # 先找左边,看有没有空位
            if not cur_node.left:
                cur_node.left = node
                return
            # 左边没有空位,就找右边
            elif not cur_node.right:
                cur_node.right = node
                return
            # 如果都没有空位,那就把左边节点与右边节点都加到之后要判断的节点中
            queue.extend((cur_node.left, cur_node.right))

    def show(self):
        # 展示树
        if not self.root:
            return
        # 从上往下,从左往右的去遍历整棵树,然后找到第一个空位
        # 把节点添加进去
        queue = [self.root]  # 存每一层的节点
        i = 1
        while queue:
            size = len(queue)  # 当前层的元素个数
            print(f'第{
     i}层', end='\t')
            for _ in range(size)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值