树的遍历:


blob.png广度优先遍历,也叫做层序遍历

层序遍历:按照树的层次,从第一层开始,自左向右遍历元素,遍历序列ABCDEFGHI












深度优先遍历:

  设树的根结点为D,左子树为L,右子树为R,且要求L一定在R之前,则有下面几种遍历方式:

  1.前序遍历,也叫先序遍历、也叫先根遍历,DLR

  2.中序遍历,也叫中根遍历,LDR

  3.后序遍历,也叫后根遍历,LRD


blob.png前序遍历DLR:

  从根结点开始,先左子树,后右子树;

  每个子树内部依然是先根结点,再左子树后右子树。递归遍历;

  遍历序列:

    A  BDGH  CEIF

    根 左子树 右子树







blob.png中序遍历:

  从根结点的左子树开始遍历,然后是根结点,再右子树;

  每个子树内部,也是先左子树,后根结点,再右子树。递归遍历

  遍历序列:

    左图

      GDHB A IECF

    右图

      GDHB A EICF





blob.png后序遍历LRD:

  先左子树,后右子树,再根结点

  每个子树内部依然是先左子树,后右子树,再根结点。递归遍历

  遍历序列:

    GHDB IEFC A









堆排序Heap Sort

堆Heap

  堆是一个完全二叉树;

  每个非叶子结点都要大于或者等于其左右孩子结点的值称为大顶堆;

  每个非叶子结点都要小于或者等于其左右孩子结点的值称为小顶堆;

  根结点一定是大顶堆中的最大值,一定是小顶堆中的最小值;


大顶堆:

blob.png

小顶堆:

blob.png



堆排序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、构建大顶堆---下一个结点的选择

  从起始结点开始向左找其同层结点,到头后再从上一层的最右边结点开始继续向左逐个查找,

  直至根结点