树的遍历:
算法
广度优先遍历,也叫作层序遍历数据结构
层序遍历:按照树的层次,从第一层开始,自左向右遍历元素,遍历序列ABCDEFGHIide
深度优先遍历:排序
设树的根结点为D,左子树为L,右子树为R,且要求L必定在R以前,则有下面几种遍历方式:递归
1.前序遍历,也叫先序遍历、也叫先根遍历,DLRit
2.中序遍历,也叫中根遍历,LDRclass
3.后序遍历,也叫后根遍历,LRD二叉树
前序遍历DLR:遍历
从根结点开始,先左子树,后右子树;im
每一个子树内部依然是先根结点,再左子树后右子树。递归遍历;
遍历序列:
A BDGH CEIF
根 左子树 右子树
中序遍历:
从根结点的左子树开始遍历,而后是根结点,再右子树;
每一个子树内部,也是先左子树,后根结点,再右子树。递归遍历
遍历序列:
左图
GDHB A IECF
右图
GDHB A EICF
后序遍历LRD:
先左子树,后右子树,再根结点
每一个子树内部依然是先左子树,后右子树,再根结点。递归遍历
遍历序列:
GHDB IEFC A
堆排序Heap Sort
堆Heap
堆是一个彻底二叉树;
每一个非叶子结点都要大于或者等于其左右孩子结点的值称为大顶堆;
每一个非叶子结点都要小于或者等于其左右孩子结点的值称为小顶堆;
根结点必定是大顶堆中的最大值,必定是小顶堆中的最小值;
大顶堆:
小顶堆:
堆排序Heap Sort
一、构建彻底二叉树
待排序数字为30,20,80,40,50,10,60,70,90
构建一个彻底二叉树存放数据,并根据性质5对元素编号,放入顺序的数据结构中
构造一个列表为[0,30,20,80,40,50,10,60,70,90]
二、构建大顶堆---核心算法
度数为2的结点A,若是它的左右孩子结点的最大值比它大的,将这个最大值和该结点交换;
度数为1的结点A,若是它的左孩子的值大于它,则交换;
若是结点A被交换到新的位置,还须要和其它孩子结点重复上面的过程;
三、构建大顶堆---起点结点的选择
从彻底二叉树的最后一个结点的双亲结点开始,即最后一层的最右边叶子结点的父结点开始;
结点数为n,则起始结点的编号为n//2(性质5)
四、构建大顶堆---下一个结点的选择
从起始结点开始向左找其同层结点,到头后再从上一层的最右边结点开始继续向左逐个查找,
直至根结点