记录一下最近对于最大堆树状打印的思考
假设一个最大堆的总元素数是
n
- 堆高:
- 当前元素
i
当前层高
- 最后一行满元素数
2k
- 每行的开头空格数为:
2∗lastFirstTab+1=1+2+4+..+2(k−ki−1)=2(k−ki)−1
- 元素间间隔大小:
2(k−ki+1)
- 因为最后一行两元素间至少有两个tab,这样parent才能放在量元素之间,以此类推。
0: 1 # first 7 tabs interval - tabs
1: 2 3 # first 3 tabs interval 8 tabs
2: 4 5 6 7 # first 1 tabs interval 4 tabs
3:8 9 10 11 12 13 14 15 # first 0 tabs interval 2 tabs
一个简单的实现如下:
struct heap_t {
type_t *node;
int heapSize;
};
bool isPower(int value, int base = 2) {
int n = log2(value);
return (pow(2, n) == value);
}
void heapPrint( heap_t *heap) {
printf( "Function: %s on line: %d\n", __FUNCTION__, __LINE__);
int heapSize = heap->heapSize;
int heapHeight = log2(heapSize);
int firstTabs;
int intervalTabs;
int currentHeight;
int i, k;
for (i = 1; i <= heapSize; i++) {
currentHeight = log2(i);
if ( isPower(i) ){
/* print first tabs */
std::cout << std::endl;
firstTabs = pow(2, heapHeight - currentHeight) - 1;
if(firstTabs)
for (k = 0; k < firstTabs; k++)
std::cout << "\t";
std::cout << heap->node[i - 1];
} else {
/* print interval tabs */
intervalTabs = pow(2, heapHeight - currentHeight + 1);
for (k = 0; k < intervalTabs; k++)
std::cout << "\t";
std::cout << heap->node[i - 1];
}
}
std::cout << std::endl;
}