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中树的遍历-堆排序的更多相关文章

  1. Python:树的遍历

    各种遍历顺序如下图所示: 树的最大深度  # class TreeNode(object): # def __init__(self, x): # self.val = x # self.left = ...

  2. python 中迭代和遍历的区别

    什么是迭代? 迭代就是重复运行一段代码语句块的能力.分为两种方式 使用递归函数 使用循环(for 或 while 循环) 假设有个需求,要按照降序打印10以下(包括10),0 以上的整数,用递归和循环 ...

  3. python中字典的遍历

    用ipython运行情况如下: #新建字典 In [1]: name_cards = {'name':'sunwukong','QQ':'123124','addr':'秦皇岛'} #生成key对象 ...

  4. 关于python中的列表遍历注意事项

    在开发过程中,很容易出现以下的错误: 可以看出:假如删除列表的元素之后直接执行continue,那么遍历的时候就会落下一个元素. 那么怎么解决这个问题呢? 首先 : 我们尝试把continue去掉: ...

  5. python中os.walk()遍历目录中所有文件

    之前一直用判断目录和文件的递归方法来获取一个目录下的所有文件,后来发现python里面已经写好了这个函数,不需要自己递归获取了,记录下os.walk()函数的用法 目的:获取path下所有文件,返回由 ...

  6. python中的倒序遍历

    1.在列表本身倒序 a = [1, 3, 7, 5, 2, 6] a.reverse() # 在列表本身进行倒序,不返回新的值 print(a) # 输出a: # [6, 2, 5, 7, 3, 1] ...

  7. Python中pymongo find 遍历数据导致timeout

    背景 在读取大约200W左右的数据的时候采用游标形式进行数据遍历时,超过10分钟就报错 timeout 原因 pymongo游标会在10分钟之后被关闭 解决方案 db.find({}, no_curs ...

  8. Python 一网打尽<排序算法>之堆排序算法中的树

    本文从树数据结构说到二叉堆数据结构,再使用二叉堆的有序性对无序数列排序. 1. 树 树是最基本的数据结构,可以用树映射现实世界中一对多的群体关系.如公司的组织结构.网页中标签之间的关系.操作系统中文件 ...

  9. 使用Python爬虫库BeautifulSoup遍历文档树并对标签进行操作详解(新手必学)

    为大家介绍下Python爬虫库BeautifulSoup遍历文档树并对标签进行操作的详细方法与函数下面就是使用Python爬虫库BeautifulSoup对文档树进行遍历并对标签进行操作的实例,都是最 ...

随机推荐

  1. 转载-cookie和session的窃取

    一.cookie的基本特性 如果不了解cookie,可以先到 wikipedia 上学习一下. http request 浏览器向服务器发起的每个请求都会带上cookie: GET /index.ht ...

  2. scu-4445

    Right turn frog is trapped in a maze. The maze is infinitely large and divided into grids. It also c ...

  3. 计算机网络 part3 HTTP&HTTPS

    一.HTTP references: HTTP [HTTP协议]---HTTP协议详解 1.概述.特点 HTTP(超文本传输协议)是一种规定了浏览器和万维网服务器通信规则的协议.客户端和服务端的指定接 ...

  4. Hexo-域名设置+收录

    Hexo-域名设置+Github域名加速+网址收录 Github.Gitee绑定域名,然后进行网址收录. 不想购买域名也完全可以进行网址收录. 购买阿里云域名 1.进入阿里云域名网站 2.进入价格详情 ...

  5. 微信分享 API

    微信分享 API https://market.cmbchina.com/MPage/online/190416201200302/wechatShare.js /* * 注意: * 1. 所有的JS ...

  6. AirPods 2 声音非常小

    AirPods 2 声音非常小 bug 停用蓝牙绝对音量 可能是因为开启了耳机的绝对音量功能; 绝对音量功能开启后,耳机的音量和手机音量分开, 可以在手机设置里停用绝对音量; refs http:// ...

  7. MarkDown编辑器基础使用教程

    教程原创链接 MarkDown 段落和换行 一个 Markdown 段落是由一个或多个连续的文本行组成,它的前后要有一个以上的空行(空行的定义是显示上看起来像是空的,便会被视为空行.比方说,若某一行只 ...

  8. eclipse定制工具栏,修改工具栏

    目前eclipse定制工具栏的入口就是window- customize perspective,在弹出的窗口中选择Tool Bar Visibility,选择要在工具栏中显示的快捷图标.注:在Too ...

  9. QT现场同步

    // 1线程同步 QFutureSynchronizer<void> synchronizer; //2线程1 synchronizer.addFuture(QtConcurrent::r ...

  10. How DRI and DRM Work

    How DRI and DRM Work Introduction This page is intended as an introduction to what DRI and DRM are, ...