最大堆树状打印

来源:互联网 发布:七天天网络 编辑:程序博客网 时间:2024/05/26 12:54

记录一下最近对于最大堆树状打印的思考

假设一个最大堆的总元素数是 n
- 堆高: 0,1,..,k=lg(n)
- 当前元素i 当前层高ki=lg(i)
- 最后一行满元素数2k
- 每行的开头空格数为: 2lastFirstTab+1=1+2+4+..+2(kki1)=2(kki)1
- 元素间间隔大小: 2(kki+1)
- 因为最后一行两元素间至少有两个tab,这样parent才能放在量元素之间,以此类推。

0:                          1                               # first 7   tabs    interval - tabs1:          2                               3               # first 3   tabs    interval 8 tabs2:  4               5               6               7       # first 1   tabs    interval 4 tabs3: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;}
原创粉丝点击