python数据结构与算法:二叉树

学习黑马程序员数据结构与算法笔记

二叉树

class Node:
    """
    节点定义
    """

    def __init__(self, element):
        """
        初始化
        :param element:
        """
        self.element = element  # 元素
        self.left_child = None  # 左节点
        self.right_child = None  # 右节点


class Tree:
    def __init__(self, node: Node = None):
        self._root = node

    def add(self, item):
        node = Node(item)
        if self._root is None:  # 必须保证self._root != None
            self._root = node
            return

        # self._root is not None
        queue = [self._root]  # 按照队列的方式的操作列表:尾部插入,头部读出

        while queue:  # 只要queue不是空,那么就可以一直循环
            cur_node = queue.pop(0)

            # 左子节点=None,那么就将新节点添加到此处
            if cur_node.left_child is None:
                cur_node.left_child = node
                return
            else:  # 左子节点不是空,那么,就将左子节点添加到队列中,方便下次处理
                queue.append(cur_node.left_child)

            # 右子节点=None,将节点添加到此处
            if cur_node.right_child is None:
                cur_node.right_child = node
                return
            else:  # 右子节点不是None,将右子节点添加到队列中
                queue.append(cur_node.right_child)

    def return_root(self):
        return self._root

    def breath_travel(self):
        """
        广度遍历
        :return:
        """
        if self._root is None:
            return None

        queue = [self._root]  # 一个队列保存节点
        while queue:  # 只要队列中不是None,就一直循环
            cur_node = queue.pop(0)  # 弹出一个元素
            print(cur_node.element, end=' ')  # 打印元素
            if cur_node.left_child is not None:
                queue.append(cur_node.left_child)
            if cur_node.right_child is not None:
                queue.append(cur_node.right_child)

        print()  # 恢复正常打印设置
	
	#  =======================#
	#  深度遍历
	#  =======================#
    def preorder(self, node: Node):
        """
        先序遍历:根节点->左子树->右子树
        递归方法实现
        :param node:
        :return:
        """
        # 递归结束条件
        if node is None:  # 叶节点的子节点都是None,但是首先判断的是左子树
            return
        print(node.element, end=' ')
        self.preorder(node.left_child)  # 遍历左子树
        self.preorder(node.right_child)  # 遍历右子树

    def inorder(self, node: Node):
        """
        中序遍历:左子树->根节点->右子树
        :param node:
        :return:
        """
        if node is None:  # 当前节点是None,就返回
            return
        self.inorder(node.left_child)
        print(node.element, end=' ')
        self.inorder(node.right_child)

    def postorder(self, node: Node):
        """
        后序遍历:左子树->右子树->根节点
        :param node:
        :return:
        """
        if node is None:
            return
        self.postorder(node.left_child)
        self.postorder(node.right_child)
        print(node.element, end=' ')


if __name__ == '__main__':
    print()
    tree = Tree(Node(0))
    for v in range(1, 10):
        tree.add(v)

    print('breath_travel')
    tree.breath_travel()
    print("preorder")
    tree.preorder(tree.return_root())
    print("\ninorder")
    tree.inorder(tree.return_root())
    print("\npostorder")
    tree.postorder(tree.return_root())
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python提供了许多数据结构算法的实现,下面是一些常见的数据结构算法: 1. 列表(List):可变序列,可以存储任意类型的元素,并且可以动态调整大小。常用的操作包括添加、删除、修改和遍历等。 2. 元组(Tuple):不可变序列,与列表类似,但元素不可修改。通常用于存储不可改变的数据。 3. 字典(Dictionary):键值对的集合,可以通过键来快速访问对应的值。字典是基于哈希表实现的,具有快速的查找性能。 4. 集合(Set):无序且不重复的元素集合。可以进行交集、并集、差集等操作。 5. 栈(Stack):后进先出(LIFO)的数据结构。常用的操作包括压栈(push)和弹栈(pop)。 6. 队列(Queue):先进先出(FIFO)的数据结构。常用的操作包括入队(enqueue)和出队(dequeue)。 7. 链表(Linked List):由一系列节点组成的数据结构,每个节点包含一个元素和一个指向下一个节点的链接。 8. 树(Tree):由节点和边组成的层次结构。树有许多种类,如二叉树、二叉搜索树、平衡二叉树等。 9. 图(Graph):由节点和边组成的非线性数据结构。图可以用来表示各种实际问题,如网络、社交关系等。 常见的算法包括: 1. 排序算法:如冒泡排序、插入排序、选择排序、快速排序、归并排序等。 2. 查找算法:如线性查找、二分查找、哈希查找等。 3. 图算法:如深度优先搜索(DFS)、广度优先搜索(BFS)、最短路径算法(Dijkstra算法、Floyd-Warshall算法)、最小生成树算法(Prim算法、Kruskal算法)等。 4. 动态规划算法:如背包问题、最长公共子序列等。 5. 分治算法:如归并排序、快速排序等。 以上只是一些常见的数据结构算法Python还提供了许多其他的库和模块,可以扩展数据结构算法的功能和性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值