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