最大堆树状打印

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

假设一个最大堆的总元素数是 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 - 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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值