Python中树的遍历-堆排序
1、二叉树的遍历
遍历:迭代所有元素一遍。
树的遍历:对树中所有的元素不重复的访问一遍,也成扫描
广度优先遍历:层序遍历
深度优先遍历:前序、中序、后续遍历。
遍历序列:将树中所有元素遍历一遍后,得到的元素序列。将层次结构转换成了线性结构。
2、层序遍历
按照数的层次,从第一层开始,自左向右遍历元素
遍历顺序ABCDEFGHI
3、深度优先遍历
设树的根节点为D,左子树为L。右子树为R,且要求L一定在R之前,有以下几种遍历方式:
前序遍历:DLR 也是先序遍历,也叫做先根遍历。DLR
中序遍历,也叫中根遍历。LDR
后序遍历:也叫做后根遍历。LRD
1)前序遍历DLR
从根结点开始,先从左子树后右子树。
遍历顺序:A BDGH CEIF
2)中序遍历LDR
从根节点的左子树开始遍历,然后是根结点,在右子树。
每个子树内部,也是先左子树,后根结点,在右子树;
3)后序遍历
先左子树,后右子树,在根节点。
每个子树内部依然是先左子树,后右子树,在根节点;
4、堆排序:Heap
堆是一个完全二叉树。
每个非叶子结点都要大于或者等于其它左右孩子结点的值成为大顶堆。
每个非叶子结点都要小于或者等于其左右孩子结点的值成为小顶堆。
根结点一定是大定对中的最大值,一定是小顶堆中最小的值。
1) 大顶堆,完全二叉树的每个非叶子结点都要大于或者等于其左右孩子结点的值。
根结点一定是大顶堆中最大值。
2) 小顶堆:
完全二叉树的每个非叶子结点都要小于或者等于其左右孩子结点的值。
根结点一定是小顶堆中最小的值。
3) 构件完全二叉树,
将待排序数字为30,20,80,40,50,10,60,70,90
构件一个完全二叉树存放数据,并根据性质5对元素进行编号。
构造一个列表为[0,30,20,80,40,50,10,60,70,90]
4) 构造大顶堆———核心算法
度数为2的结点A,如果他的左右孩子结点的最大值比他的值大,将这个最大值与该结点交换。
度数为1的节点,如果他的左孩子的值大于他,则交换。
如果结点被交换到新的位置,还需和其它孩子结点重复上面的过程。
5) 起点结点的选择。
从完全二叉树的最后一个结点的双亲结点开始,及最后一层的最后边叶子结点的父结点开始。
结点树为n,则其实结点的编号为n//2
6) 下一个结点的选择:
从其实结点开始向左找其同层结点,到头后在从上一层的最右边结点开始继续向左逐个查找,直至根结点。
7) 大顶堆目标,确保每个结点的值都比左右点的值大。
8) 排序:
将大顶堆根节点 这个最大值和最后一个叶子结点交换,那么最后一个叶子结点就是最大值,将这个叶子节点排除在待排序结点之外。
从根节点开始(新的根节点),重新调整为大顶堆,重复上一步。
9)大顶堆总结:最大值一定在最顶层。次大值一定在第二层。
堆排序总结:
1、时间复杂度o(nlogn)
2、由于堆排序对原始记录的排序状态并不敏感,因此无论是最好、最坏和平均时间复杂度均为o(nlogn)。时间比较稳定。
3、空间复杂度。只是使用了一个交换用的空间,空间复杂度就是o(1)
4、稳定性,不稳定的排序算法。
熟悉树的概念之上的。
堆排序代码:
import math
def print_tree(array):
index = 1
depth = math.ceil(math.log2(len(array)))
sep = ' '
for i in range(depth):
offset = 2 ** i
print(sep
*(2**(depth-i-1)-1), end='')
line = array[index:index+offset]
for j, x in enumerate(line):
print("{:>{}}".format(x, len(sep)), end='')
interval = 0 if i == 0 else 2 ** (depth-i) - 1
if j
< len(line) - 1:
print(sep
* interval, end='')
index += offset
print()
origin = [0, 30, 20, 80, 40, 50, 10, 60, 70, 90]
total = len(origin) - 1
print(origin)
print_tree(origin)
print('++++++++')
def heap_adjust(n, i, array:list):
while 2 * i <= n:
lchile_index = 2 * i
max_child_index = lchile_index
if n>
lchile_index and array[lchile_index + 1] > array[lchile_index]:
max_child_index =
lchile_index + 1
if array[max_child_index]
> array[i]:
array[i], array[max_child_index] = array[max_child_index], array[i]
i = max_child_index
else:
break
def max_heap(total, array:list):
for i in range(total//2, 0, -1):
heap_adjust(total, i, array)
return array
print_tree(max_heap(total, origin))
print('--------------------')
def sort(total, array:list):
while total
> 1:
array[1], array[total] = array[total], array[1]
total -= 1
if total
== 2 and array[total]
>= array[total-1]:
break
heap_adjust(total, 1, array)
return array
print_tree(sort(total, origin))
print(origin)
Python中树的遍历-堆排序的更多相关文章
- Python:树的遍历
各种遍历顺序如下图所示: 树的最大深度 # class TreeNode(object): # def __init__(self, x): # self.val = x # self.left = ...
- python 中迭代和遍历的区别
什么是迭代? 迭代就是重复运行一段代码语句块的能力.分为两种方式 使用递归函数 使用循环(for 或 while 循环) 假设有个需求,要按照降序打印10以下(包括10),0 以上的整数,用递归和循环 ...
- python中字典的遍历
用ipython运行情况如下: #新建字典 In [1]: name_cards = {'name':'sunwukong','QQ':'123124','addr':'秦皇岛'} #生成key对象 ...
- 关于python中的列表遍历注意事项
在开发过程中,很容易出现以下的错误: 可以看出:假如删除列表的元素之后直接执行continue,那么遍历的时候就会落下一个元素. 那么怎么解决这个问题呢? 首先 : 我们尝试把continue去掉: ...
- python中os.walk()遍历目录中所有文件
之前一直用判断目录和文件的递归方法来获取一个目录下的所有文件,后来发现python里面已经写好了这个函数,不需要自己递归获取了,记录下os.walk()函数的用法 目的:获取path下所有文件,返回由 ...
- python中的倒序遍历
1.在列表本身倒序 a = [1, 3, 7, 5, 2, 6] a.reverse() # 在列表本身进行倒序,不返回新的值 print(a) # 输出a: # [6, 2, 5, 7, 3, 1] ...
- Python中pymongo find 遍历数据导致timeout
背景 在读取大约200W左右的数据的时候采用游标形式进行数据遍历时,超过10分钟就报错 timeout 原因 pymongo游标会在10分钟之后被关闭 解决方案 db.find({}, no_curs ...
- Python 一网打尽<排序算法>之堆排序算法中的树
本文从树数据结构说到二叉堆数据结构,再使用二叉堆的有序性对无序数列排序. 1. 树 树是最基本的数据结构,可以用树映射现实世界中一对多的群体关系.如公司的组织结构.网页中标签之间的关系.操作系统中文件 ...
- 使用Python爬虫库BeautifulSoup遍历文档树并对标签进行操作详解(新手必学)
为大家介绍下Python爬虫库BeautifulSoup遍历文档树并对标签进行操作的详细方法与函数下面就是使用Python爬虫库BeautifulSoup对文档树进行遍历并对标签进行操作的实例,都是最 ...
随机推荐
- Leetcode(206)-反转链表
反转一个单链表. 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 思路:反转链表很简 ...
- 一个汉字在php中占几个字节?
问:一个汉字在php中占几个字节? 答: 对于中文字符,若使用 GBK.Big-5 版本,每个中文字符相当于 2 个字节: 若使用 UTF-8 版本,每个中文字符相当于 3 个字节.
- vue stop event bug
vue stop event bug [Vue warn]: Error in v-on handler: "TypeError: e.prevntDefault is not a func ...
- iPhone 12 导入通讯录排序 Bug
iPhone 12 导入通讯录排序 Bug iOS iOS 通讯录排序问题 Huawei OK solution iOS 切换中英文,修复排序通讯录 bug Awesome iOS Contacts ...
- js spider
js spider https://gist.github.com/xgqfrms-GitHub/0bf82ff06037a0d1776c9f30033cbfd1 https://www.cnblog ...
- MacBook Pro 2019 13 inch & screen blink
MacBook Pro 2019 13 inch & screen blink MacBook Pro 闪屏 https://macreports.com/mac-how-to-trouble ...
- HTTP/3 protocol
HTTP/3 protocol https://caniuse.com/#feat=http3 HTTP/3 H3 https://en.wikipedia.org/wiki/HTTP/3 QUIC ...
- Flutter: 下拉刷新,上拉加载更多
import 'package:flutter/material.dart'; import 'package:english_words/english_words.dart'; void main ...
- DAPHNE PATEL:有主见的人,才能活出精彩人生
有主见的人,会活出什么样子呢?近日,NGK灵石团队技术副总裁DAPHNE 女士给出了答案. DAPHNE PATEL表示,有主见的人,才能活出精彩的人生.为什么这么说呢? DAPHNE PATEL用自 ...
- 算法型稳定币USDN有什么魔力引发市场热潮?
最近比特币重新突破了8万大关,区块链行业又再次火爆起来,吸引了圈内圈外人的火热讨论,而这其中市场投资者讨论最频繁的就要属算法型稳定币USDN了. USDN是基于NGK.IO区块链中的稳定币, 1枚US ...