0001 template <typename T> void UniPrint::p(ComplHeap<T>& pq) { //打印输出ComplHeap 0002 printf("%s*%d:\n", typeid(pq).name(), pq.size()); //基本信息 0003 int branchType[256]; //最深256层 <= 2^256 = 1.16*10^77 0004 printComplHeap((Vector<T>&) pq, pq.size(), 0, 0, ROOT, branchType); //树状结构 0005 printf("\n"); 0006 } 0007 0008 template <typename T> static void printComplHeap(Vector<T>& elem, int n, int k, int depth, int type, int* bType) { //递归打印输出 0009 if (k >= n) return; //递归基 0010 bType[depth] = type; 0011 printComplHeap(elem, n, RC(k), depth+1, R_CHILD, bType); //右子树(在上) 0012 print(elem[k]);(0 < k) && (elem[PARENT(k)] < elem[k]) ? printf("X") : printf(" "); printf("*"); 0013 for (int i = 0; i < depth; i++) //根据相邻各层 0014 if (bType[i] + bType[i+1]) //的拐向是否一致,即可确定 0015 printf(" "); //是否应该 0016 else printf("│ "); //打印横线 0017 switch (type) { 0018 case R_CHILD : printf("┌─"); break; 0019 case L_CHILD : printf("└─"); break; 0020 default : printf("──"); break; //root 0021 } 0022 print(elem[k]);(0 < k) && (elem[PARENT(k)] < elem[k]) ? printf("X") : printf(" "); printf("\n"); 0023 printComplHeap(elem, n, LC(k), depth+1, L_CHILD, bType); //左子树(在下) 0024 }