图形化打印二叉树


  • 首先,需要一个数组来作为显示的缓存,我们选取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版权协议,转载请附上原文出处链接和本声明。