树结构可视化
前提树节点左右子节点为C[0],C[1]。
#ifndef DATASTRUCT_PRINTTREE_H
#define DATASTRUCT_PRINTTREE_H
#include <cassert>
#include <cstdio>
template<class T>
class Printer {
T *TreeRoot;
T *NullNode;
T **arrNodes;
int MaxNodeDeep;
void (*PrintNode)(T *node);
int PrintWidth;
void GetMaxNodeDeep(T *CurrentNode, int CurrentDeep = 0) {
if (CurrentNode == NullNode) {
if (CurrentDeep > MaxNodeDeep)MaxNodeDeep = CurrentDeep;
return;
}
GetMaxNodeDeep(CurrentNode->c[0], CurrentDeep + 1);
GetMaxNodeDeep(CurrentNode->c[1], CurrentDeep + 1);
}
void Init(T *CurrentNode, int Index = 1) {
if (CurrentNode == NullNode)return;
arrNodes[Index] = CurrentNode;
Init(CurrentNode->c[0], Index << 1);
Init(CurrentNode->c[1], Index << 1 | 1);
}
void PrintChars(int Count, char CharToPrint = ' ') {
for (; Count-- > 0;)putchar(CharToPrint);
}
public:
Printer(T *root, T *nil, void (*printer)(T *node), int width) : TreeRoot(root), NullNode(nil),
MaxNodeDeep(0), PrintNode(printer),
PrintWidth(width + 2) {
GetMaxNodeDeep(TreeRoot);
arrNodes = new T *[1 << MaxNodeDeep];
assert(arrNodes);
for (int i = 0; i < 1 << MaxNodeDeep; ++i)arrNodes[i] = 0;
Init(TreeRoot);
}
~Printer() {
assert(arrNodes);
delete[]arrNodes;
}
void print() {
for (int i = 1, d = 1; i <= MaxNodeDeep; ++i, d <<= 1) {
int CurrentWidth = (1 << MaxNodeDeep - i - 1) * PrintWidth;
int SpaceWidth = CurrentWidth;
PrintChars(CurrentWidth >> 1);
if (CurrentWidth == 0)CurrentWidth = 1;
for (int j = d; j < d << 1; ++j) {
putchar('|');
PrintChars(CurrentWidth - PrintWidth >> 1, '-');
arrNodes[j] == 0 ? PrintChars(PrintWidth - 2, ' ') : PrintNode(arrNodes[j]);
PrintChars(CurrentWidth - PrintWidth >> 1, '-');
putchar('|');
PrintChars(SpaceWidth);
}
putchar('\n');
}
}
};
#endif DATASTRUCT_PRINTTREE_H