- 首先,需要一个数组来作为显示的缓存,我们选取buffer[6][128]这样一个缓存,因此最大只能显示6层的树。将buffer中的元素全部初始化为INF
- 统计出树的高度,从1开始计数。
- 采用中序遍历的方法在缓存中打印树。采用一个全局变量 x 来记录应该在哪个横坐标处打印。每次打印一个数都++,每次遇见NULL则x = x + pow(2, height-level) - 1. 至于纵坐标则采用递归参数level来控制。
- 将buffer打印出来,INF打印为空格,数字正常打印。
相关代码如下:
#define MAX(a,b) (((a)>(b))?(a):(b))
using namespace std;
typedef struct Node{
int value;
struct Node* left;
struct Node* right;
}Node, *BinaryTree;
int PrintTree_h_height;
char PrintTree_h_buffer[6][128];
int PrintTree_h_x;
int PrintTree_h_treeHeight(BinaryTree tree){
if (tree == NULL) return 0;
int heightLeft = PrintTree_h_treeHeight(tree->left);
int heightRight = PrintTree_h_treeHeight(tree->right);
return MAX(heightLeft, heightRight) + 1;
}
void PrintTree_h_corePrintTree(BinaryTree tree, int level){
if (tree == NULL){
PrintTree_h_x += (pow(2, PrintTree_h_height - level) - 1);
return;
}
char(*a)[128] = PrintTree_h_buffer;
PrintTree_h_corePrintTree(tree->left, level + 1);
a[level][PrintTree_h_x++] = tree->value;
PrintTree_h_corePrintTree(tree->right, level + 1);
}
#define INF 127
void printTree(BinaryTree tree){
if (tree == NULL) return;
char(*a)[128] = PrintTree_h_buffer;
for (int i = 0; i<6; i++){
for (int j = 0; j<128; j++){
a[i][j] = INF;
}
}
//先获取树高度
PrintTree_h_height = PrintTree_h_treeHeight(tree);
if (PrintTree_h_height > 6){
cout << "树超过6层,无法打印" << endl;
return;
}
PrintTree_h_corePrintTree(tree, 0);
for (int i = 0; i < 6; i++){
for (int j = 0; j < 128; j++){
if (a[i][j] == INF) cout << " ";
else cout << (int)a[i][j];
}
cout << endl;
}
}最终打印结果示例:
版权声明:本文为yzq7890原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。