Python算法笔记(3)-树、二叉树、二叉堆、二叉搜索树

在这里插入图片描述

树和二叉树

什么是树

树是一种非线性的数据结构,由n个节点构成的有限集合,节点数0的树叫空树,在任意一棵树中,有且仅有一个特点的称为根节点,当N>1时,其余节点可分m为互不相交的有限集。
例如如下:

class Tree:
    def __init__(self, af=0, mid=None, ru=None):
        self.af = af
        self.mid = mid
        self.ru = ru
    


在这里插入图片描述

什么是二叉树

二叉树是树的一种特殊形式,每个节点有两个子节点,最多两个,也有1哥
在这里插入图片描述

class node :
    def __init__(self,ru,su=None,bu=None):
        self.ru =ru
        self.su =su
        self.bu = bu
class tree:
    def __init__(self,rut=None):
        self.rut = rut

二叉树如何用

二叉树主要应用于查找操作和维持相对顺序

二叉查找树

二叉查找树仔二叉树上增加几个条件
1。如果左子树不为空,则右子树上所有的节点的值均小于根节点的值
2。如果右子树不为空,则右子树上所有的节点的值均大于根节点的值
3。左子树,右子树都是二叉查找树
在这里插入图片描述
对于一个节点分布相对均衡的二叉查找树来说,如果节点总数是n,那么搜索节点时间复杂度就是O(logn),和树的深度一样。

二叉树如何遍历

为什么要遍历?

遍历本身是一个线性操作,所以遍历同样具有线性结构的数组和链表是一件轻而易举的事情。
二叉树的遍历分为四种:先序遍历,中序遍历,后序遍历,层序遍历
宏观角度看,二叉树的遍历归类为:1。深度遍历(前序遍历、中序遍历、后序遍历)、广度优先遍历

深度优先遍历

在这里插入图片描述
也可以用binarytree插件来实现

from binarytree import Node

root = Node(1)
root.left = Node(2)
root.right = Node(3)
root.left.left = Node(4)
root.left.right = Node(5)
root.right.right = Node(6)

print(root)

相关binarytree用法参考这篇文章
在这里插入图片描述
后面print(root.preorder)即可使用先序遍历顺序

在这里插入图片描述

在这里插入图片描述

from binarytree import Node

root = Node(1)
root.left = Node(2)
root.right = Node(3)
root.left.left = Node(4)
root.left.right = Node(5)
root.right.right = Node(6)

print(root.inorder)#中序遍历

在这里插入图片描述

在这里插入图片描述

from binarytree import Node

root = Node(1)
root.left = Node(2)
root.right = Node(3)
root.left.left = Node(4)
root.left.right = Node(5)
root.right.right = Node(6)
print(root)
print(root.postorder)

在这里插入图片描述

广度优先遍历

层序遍历

from binarytree import Node

root = Node(1)
root.left = Node(2)
root.right = Node(3)
root.left.left = Node(4)
root.left.right = Node(5)
root.right.right = Node(6)
print(root)
print(root.levelorder)

在这里插入图片描述

什么是二叉堆

二叉堆本质上是一种完全二叉树,分为最大堆和最小堆
最大堆的任何一个父节点的值都大于或等于右孩子或左孩子节点的值
最小堆的任何一个父节点的值,都小于或等于他的左孩子或右孩子的值。
二叉堆的根节点叫堆顶
最大堆和最小堆的特点决定了,最大堆的堆顶的堆顶使整个堆中的最大元素,最小堆的堆顶使整个堆中的最小元素。

from binarytree import Node

root = Node(1)
root.left = Node(3)
root.right = Node(2)
root.right.left = Node(7)
root.right.right =Node(8)
root.left.left = Node(6)
root.left.right = Node(5)
root.left.left.left = Node(9)
root.left.left.right = Node(10)
root.left.right.right = Node(0)

print(root)

在这里插入图片描述

什么是优先队列

优先队列分为最大优先队列和最小优先队列
最大优先队列,无论入队顺序如何,都是当前最大的元素优先出队
最小优先队列,无论入队顺序如何,都是当前最小的元素优先出队

优先队列的特点

优先队列具有队列的所有特性,包括队列的基本操作

优先队列如何实现?

在python中可以用到queue来实现队列优先级的尝试

import queue

# 定义元素对象
class test(object):
    def __init__(self, pr, name):
        self.pr = pr
        self.name = name

    def __str__(self):
        return "test(priority={p}, name={n})".format(p=self.pr, n=self.name)

    def __lt__(self, other):
        """ 定义<比较操作符。"""
        # 从大到小排序
        return self.pr > other.pr


tsq = queue.PriorityQueue()

# 插入元素
tsq.put_nowait(test(10, "task1"))  # 先进队列中最大值先出列
tsq.put_nowait(test(1, "task2"))
tsq.put_nowait(test(5, "task3"))

print("未优先队列之前:")
for item in tsq.queue:
    print(item)

print("最大元素优先出列")
print(tsq.get())

print("最大元素出列后剩余元素:")
for item in tsq.queue:
    print(item)
    

在这里插入图片描述
可以看到最大元素10就已经出列,10出列之后,剩余元素5为最大值,所以元素5的顺序排位就调高到最高为止,接下来出列的就是5。

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

轻烟飘荡

我想吃甜筒

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值