用c语言和easyx实现二叉树图形遍历
时间: 2023-11-25 14:06:10 浏览: 496
二叉树图形遍历是指按照某种遍历方式(如前序、中序、后序)依次访问二叉树的每个节点,并将节点在屏幕上以图形化的方式展示出来。下面是一个使用C语言和EasyX图形库实现二叉树图形遍历的示例代码:
```c
#include <graphics.h>
#include <stdio.h>
#include <stdlib.h>
#define WIDTH 800
#define HEIGHT 600
struct TreeNode {
int value;
struct TreeNode *left;
struct TreeNode *right;
};
void drawNode(int x, int y, int value) {
char text[10];
setfillcolor(GREEN);
fillellipse(x, y, 20, 20);
sprintf(text, "%d", value);
setbkmode(TRANSPARENT);
settextcolor(WHITE);
outtextxy(x - 8, y - 8, text);
}
void drawLine(int x1, int y1, int x2, int y2) {
setlinestyle(PS_SOLID, 2);
line(x1, y1, x2, y2);
}
void drawTree(struct TreeNode *root, int x, int y, int gap) {
if (root == NULL) {
return;
}
drawNode(x, y, root->value);
if (root->left != NULL) {
drawLine(x, y, x - gap, y + gap);
drawTree(root->left, x - gap, y + gap, gap / 2);
}
if (root->right != NULL) {
drawLine(x, y, x + gap, y + gap);
drawTree(root->right, x + gap, y + gap, gap / 2);
}
}
struct TreeNode *createNode(int value) {
struct TreeNode *node = (struct TreeNode *)malloc(sizeof(struct TreeNode));
node->value = value;
node->left = NULL;
node->right = NULL;
return node;
}
struct TreeNode *createTree() {
struct TreeNode *root = createNode(1);
root->left = createNode(2);
root->right = createNode(3);
root->left->left = createNode(4);
root->left->right = createNode(5);
root->right->left = createNode(6);
root->right->right = createNode(7);
return root;
}
void preOrder(struct TreeNode *root) {
if (root != NULL) {
printf("%d ", root->value);
preOrder(root->left);
preOrder(root->right);
}
}
int main() {
initgraph(WIDTH, HEIGHT);
setbkcolor(BLACK);
cleardevice();
struct TreeNode *root = createTree();
drawTree(root, WIDTH / 2, 50, 200);
getch();
closegraph();
return 0;
}
```
在这个示例代码中,我们定义了一个`struct TreeNode`结构体来表示二叉树的节点,包括节点的值、左子树和右子树。`drawNode()`函数用于绘制一个节点的图形,它会在屏幕上画一个绿色的圆,并在圆内显示节点的值。`drawLine()`函数用于绘制两个节点之间的连线,它会在屏幕上画一条实线。`drawTree()`函数用于绘制整个二叉树的图形,它使用递归的方式遍历二叉树,并在每个节点处调用`drawNode()`和`drawLine()`函数。`createNode()`函数用于创建一个新的节点,`createTree()`函数用于创建一个包含七个节点的二叉树。
在`main()`函数中,我们先调用`initgraph()`函数来初始化EasyX图形库,然后创建一个包含七个节点的二叉树,并调用`drawTree()`函数来绘制二叉树的图形。最后调用`getch()`函数等待用户按下任意键,然后调用`closegraph()`函数关闭图形窗口并退出程序。
这个示例代码只实现了二叉树的图形遍历,没有实现二叉树的逻辑遍历。如果需要实现逻辑遍历,可以在`drawTree()`函数中添加相应的遍历代码,例如前序遍历代码如下:
```c
void preOrder(struct TreeNode *root) {
if (root != NULL) {
printf("%d ", root->value);
drawNode(x, y, root->value); // 绘制节点的图形
if (root->left != NULL) {
drawLine(x, y, x - gap, y + gap); // 绘制左子树的连线
}
drawTree(root->left, x - gap, y + gap, gap / 2); // 递归绘制左子树
if (root->right != NULL) {
drawLine(x, y, x + gap, y + gap); // 绘制右子树的连线
}
drawTree(root->right, x + gap, y + gap, gap / 2); // 递归绘制右子树
preOrder(root->left); // 递归遍历左子树
preOrder(root->right); // 递归遍历右子树
}
}
```
阅读全文