二叉树的遍历和堆排序

二叉树的遍历和堆排序

## 二叉树的遍历

### 广度优先遍历

层序遍历 上到下 左到右 ABCDEFG

### 深度优先遍历

一探到底 根D 左子树L 右子树R
前序遍历 先根遍历 根 左 右 DLR
中序遍历 中根遍历 左 根 右 LDR
后序遍历 后根遍历 左 右 根 LRD

### 遍历序列

## 堆排序Heap Sort

大顶堆
小顶堆

构建完全二叉树

性质5:编号即索引

构建大顶堆
结点的度:叶子度为0,树的度是结点最大的度。

从最后一个叶子的父结点开始 n//2

import math

#居中对齐方案

def print_tree(array, unit_width=2):
length = len(array)
depth = math.ceil(math.log2(length + 1))

index = 0

width = 2 ** depth – 1 #行宽,最深的行 15
for i in range(depth):
for j in range(2 ** i):
#居中打印,后面追加一个空格
print(‘{:^{}}’.format(array[index], width * unit_width), end=’*’ * unit_width)
index += 1
if index >= length:
break
width = width // 2
print()

print_tree([x+1 for x in range(9) ])

#投影栅格实现
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()

print_tree([0, 1, 2, 4, 10, 20, 32, 40, 600])

origin = [0, 30, 20, 80, 40, 50, 10, 60, 70, 90]

total = len(origin) – 1
# print(origin)
# print_tree(origin)
print(“=”*50)

def heap_adjust(n, i, array: list):
”’
调整当前节点(核心算法)

调整的结点的起点在n // 2, 保证所有调整的结点都有孩子结点
:param n: 待比较数个数
:param i: 当前结点的下标
:param array: 待排序数据
:return: None
”’

while 2 * i <= n:
#孩子结点判断 2i为左孩子 2i + 1为右孩子
lchild_index = 2 * i
max_child_index = lchild_index
if n > lchild_index and array[lchild_index + 1] > array[lchild_index]:# n > 2i 说明还有右孩子
max_child_index = lchild_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

# print_tree(array)

heap_adjust(total, total // 2, origin)
print(origin)
# print_tree(origin)

#构建大顶堆、大根堆
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))

#排序
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)

本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/98644

(0)
JacoJaco
上一篇 2018-05-16
下一篇 2018-05-16

相关推荐

  • python学习总结

    第一个项目日志分析。(存在不足)

    Python笔记 2018-05-06
  • Python第三周小结

    经过了三周的学习,我们已经基本完成了Python基础数据结构的学习,包括列表,字符串,元组,bytes, bytearray, set, 字典等。为了更好的理解和熟练使用这些基本的数据结构,我将它们各自的特点分别总结 并做成了表格,希望能够帮助我们更好的理解的同时,熟练掌握这些数据结构。    

    2018-04-10
  • 文件操作

    文件操作 冯诺依曼体系架构 CPU由运算器和控制器组成 运算器,完成各种算数的运算,逻辑运算,数据传输等数据加工处理 控制器,控制程序的执行 存储器,用于记忆程序的数据,列如内存 输入设备,将数据或者程序输入到计算机中列如键盘 鼠标 输出设备,将数据或者程序的处理结果展示给用户,列如显示器,打印机等等   一般说的IO操作,指的是文件的IO,如果是指网络的I…

    Python笔记 2018-05-02
  • Python文件操作

    计算机体系架构 运算器:完成各种算术运算、逻辑运算、出具传输等数据加工处理 控制器:控制程序的执行 CPU = 运算器 + 控制器 存储器:用于记忆程序的数据,内存 输入设备:将数据或程序输入到计算机中 输出设备:将数据或程序的处理结果展示给用户 文件IO常用操作 open 打开 read 读取 write 写入 close 关闭 readline 行读取 …

    Python笔记 2018-05-02
  • Python面向对象基础

    语言分类 面向机器 抽象成机器指令,让机器容易理解 代表:汇编语言 面向过程 按照步骤一步一步走,若出现情况A做相应的处理,若出现情况B做相应的处理 问题规模小,可以步骤化,按部就班处理 代表:C 面向对象OOP 计算机需要处理的问题的规模越来越大,需要多人、多部门协作 代表:C++、Java、Python 面向对象 一种认识世界、分析世界的方法论。将万事万…

    2018-05-06