堆的概念:

  • 堆中某个节点的值总是不大于或不小于其父节点的值;
  • 堆总是一棵完全二叉树。

以百度的一个面试题为例:

  序列{9,12,17,30,50,20,60,65,4,19}构造为堆后,堆所对应的的中序遍历序列可能为

A、65,12,30,50,9,19,20,4,,17,60
B、65,12,30,9,50,19,4,20,17,60
C、65,9,30,12,19,50,4,20,17,60
D、65,12,9,30,50,4,20,9,17,60

一、序列构造成堆:

  堆构造原则:先固定已稳定的堆,再 安照从上到下,从左到右的原则堆积。

  小顶堆原理:每个结点的值都小于其左孩子和右孩子结点的值

  

java 小顶堆 小顶堆序列_java 小顶堆

                                        

java 小顶堆 小顶堆序列_结点_02

 

 

java 小顶堆 小顶堆序列_java 小顶堆_03

                           

java 小顶堆 小顶堆序列_数组_04

 

 

java 小顶堆 小顶堆序列_java 小顶堆_05

                           

java 小顶堆 小顶堆序列_数组_06

 

 

 

java 小顶堆 小顶堆序列_中序遍历_07

             

java 小顶堆 小顶堆序列_数组_08

 

java 小顶堆 小顶堆序列_中序遍历_09

             

java 小顶堆 小顶堆序列_java 小顶堆_10

 

java 小顶堆 小顶堆序列_中序遍历_11

              

java 小顶堆 小顶堆序列_java 小顶堆_12

 

java 小顶堆 小顶堆序列_java 小顶堆_13

         

java 小顶堆 小顶堆序列_java 小顶堆_14

 

java 小顶堆 小顶堆序列_数组_15

  小顶堆映射的数组为 

java 小顶堆 小顶堆序列_中序遍历_16

大顶堆

  原理与小顶堆相似:每个结点的值都大于其左孩子和右孩子结点的值

        

java 小顶堆 小顶堆序列_中序遍历_17

 

  大顶堆映射的数组为 

java 小顶堆 小顶堆序列_java 小顶堆_18

 

  注:蓝色为稳定状态,橙色为新增未确定状态,红色为要调整状态

二、堆所对应的的中序遍历序列

   中序遍历:左中右     对构造成功的 小顶堆

  

java 小顶堆 小顶堆序列_中序遍历_19

     

java 小顶堆 小顶堆序列_结点_20

java 小顶堆 小顶堆序列_java 小顶堆_21

              

java 小顶堆 小顶堆序列_数组_22

 

 

 

java 小顶堆 小顶堆序列_数组_23

        

java 小顶堆 小顶堆序列_java 小顶堆_24

 

java 小顶堆 小顶堆序列_结点_25

        

java 小顶堆 小顶堆序列_java 小顶堆_26

 

java 小顶堆 小顶堆序列_数组_27

      

java 小顶堆 小顶堆序列_数组_28

 

java 小顶堆 小顶堆序列_数组_29

    

java 小顶堆 小顶堆序列_结点_30

 

 

java 小顶堆 小顶堆序列_数组_31

      

java 小顶堆 小顶堆序列_结点_32

 

java 小顶堆 小顶堆序列_数组_33

 中序遍历遍历结果:

java 小顶堆 小顶堆序列_数组_34

 答案选: B

先序遍历遍历结果:

java 小顶堆 小顶堆序列_数组_35

后序遍历遍历结果:

java 小顶堆 小顶堆序列_中序遍历_36