1、使用简单的 printf 打印多行输出
直接输出构成树的ASCII字符。我们可以用|
表示树干,*
表示树冠。
#include <stdio.h>
int main() {
printf(" *\n");
printf(" ***\n");
printf(" *****\n");
printf(" *******\n");
printf(" |\n");
printf(" |\n");
return 0;
}
2、使用循环来绘制树
利用循环可以更灵活地控制树的高度和宽度。
#include <stdio.h>
int main() {
int height = 5;
for (int i = 0; i < height; i++) {
for (int j = 0; j < height - i - 1; j++) {
printf(" ");
}
for (int j = 0; j < 2 * i + 1; j++) {
printf("*");
}
printf("\n");
}
for (int i = 0; i < 2; i++) {
printf(" |\n");
}
return 0;
}
3、使用函数进行分步绘制
将绘制树的代码封装成函数,可以提高代码的可读性和复用性。
#include <stdio.h>
int main() {
int height = 5;
for (int i = 0; i < height; i++) {
for (int j = 0; j < height - i - 1; j++) {
printf(" ");
}
for (int j = 0; j < 2 * i + 1; j++) {
printf("*");
}
printf("\n");
}
for (int i = 0; i < 2; i++) {
printf(" |\n");
}
return 0;
}
4、使用二维数组来存储和打印树
将树的每一行存储在一个字符数组中,然后逐行输出。
#include <stdio.h>
#include <string.h>
int main() {
char tree[5][11] = {
" *",
" ***",
" *****",
" *******",
" |"
};
for (int i = 0; i < 5; i++) {
printf("%s\n", tree[i]);
}
printf(" |\n");
return 0;
}
5、递归绘制树
根据当前的高度,输出相应数量的星号。输出一个竖线。递归调用自身,绘制两个更小的子树。
#include <stdio.h>
void drawTreeCrown(int spaces, int stars, int height) {
if (height == 0) {
return; // 递归结束条件
}
// 输出前导空格
for (int i = 0; i < spaces; i++) {
printf(" ");
}
// 输出星号
for (int i = 0; i < stars; i++) {
printf("*");
}
printf("\n");
// 递归调用,减少空格数,增加星号数
drawTreeCrown(spaces - 1, stars + 2, height - 1);
}
void drawTreeTrunk(int spaces, int height) {
// 绘制树干
for (int i = 0; i < height; i++) {
// 输出空格,让树干居中
for (int j = 0; j < spaces; j++) {
printf(" ");
}
printf("|\n");
}
}
int main() {
int height = 5; // 树冠的高度
// 绘制树冠,起始空格数为高度减1,起始星号数为1
drawTreeCrown(height - 1, 1, height);
// 绘制树干,树干的高度设置为2
drawTreeTrunk(height - 1, 2);
return 0;
}