堆的概念:
- 堆中某个节点的值总是不大于或不小于其父节点的值;
- 堆总是一棵完全二叉树。
以百度的一个面试题为例:
序列{9,12,17,30,50,20,60,65,4,19}构造为堆后,堆所对应的的中序遍历序列可能为
65,12,30,50,9,19,20,4,,17,60
65,12,30,9,50,19,4,20,17,60
65,9,30,12,19,50,4,20,17,60
65,12,9,30,50,4,20,9,17,60
一、序列构造成堆:
1:1~9都是,从上到下,从左到右堆积
2
3
4
5
6
7
8
9
10:10中可知,4<30,所以调换位置得到11;
11
12:12中可知,4<12,所以调换位置得到13;
13
14:14中可知,4< 9,所以调换位置得到15,
15:15中加入序列【19】得到16,
16
17:17中可知,19< 50,所以调换位置得到18,
18
上图小顶堆,
1~9都是,从上到下,从左到右堆积,
10中可知,4<30,所以调换位置得到11;
12中可知,4<12,所以调换位置得到13;
14中可知,4< 9,所以调换位置得到15,
此时堆稳定,从上到下,从左到右堆积;
15中加入序列【19】得到16,
17中可知,19< 50,所以调换位置得到18,
完成了上述序列的堆的构造。
二、堆所对应的的中序遍历序列
中序遍历:左中右
对18进行中序遍历
1、访问 4 的 左结点 9
2、访问 9 的 左结点 12
3、访问 12 的 左结点 65,因为 65 没有 左结点,所以取中序遍历的第一个值 65
当前序列:65
4、下图 矩形柱 65(左),下一步 12(中)
当前序列:65,12
5、下图 矩形柱 65(左), 12(中),下一步 30(右)
当前序列:65,12,30
6、下图 矩形柱 12(左), 下一步 9(中)
当前序列:65,12,30,9
6、下图 矩形柱 12(左), 9(中),下一步 19(右)但是19有 左结点,
当前序列:65,12,30,9
7、下图 矩形柱 50(左),且50有 无 左结点,
当前序列:65,12,30,9,50
8、当前序列:65,12,30,9,50,19
9、当前序列:65,12,30,9,50,19,4
10、当前序列:65,12,30,9,50,19,4,20
11、当前序列:65,12,30,9,50,19,4,20,17
12、当前序列:65,12,30,9,50,19,4,20,17,60
原文地址:https://www.cnblogs.com/mww-NOTCOPY/p/12357402.html