下面是使用easyx图形库实现二叉树的遍历的示例代码:
```cpp
#include <graphics.h>
#include <conio.h>
#include <iostream>
#include <queue>
using namespace std;
const int WIDTH = 800; // 窗口宽度
const int HEIGHT = 600; // 窗口高度
const int RADIUS = 25; // 节点半径
const int DISTANCE_X = 50; // 节点之间的水平距离
const int DISTANCE_Y = 70; // 节点之间的垂直距离
// 二叉树节点结构体
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
// 画节点
void drawNode(int x, int y, int val) {
setlinecolor(BLACK);
setfillcolor(LIGHTGRAY);
fillellipse(x, y, RADIUS, RADIUS);
setbkmode(TRANSPARENT);
settextstyle(20, 0, _T("Arial"));
settextcolor(BLACK);
TCHAR str[10];
_stprintf_s(str, _T("%d"), val);
outtextxy(x - 10, y - 10, str);
}
// 画边
void drawEdge(int x1, int y1, int x2, int y2) {
setlinecolor(BLACK);
setlinestyle(PS_SOLID, 2);
line(x1, y1 + RADIUS, x2, y2 - RADIUS);
}
// 递归先序遍历
void preOrder(TreeNode* root) {
if (root == NULL) {
return;
}
drawNode(root->val, root->val * DISTANCE_Y, root->val);
if (root->left) {
drawEdge(root->val, root->val * DISTANCE_Y, root->left->val, root->left->val * DISTANCE_Y);
}
if (root->right) {
drawEdge(root->val, root->val * DISTANCE_Y, root->right->val, root->right->val * DISTANCE_Y);
}
preOrder(root->left);
preOrder(root->right);
}
// 递归中序遍历
void inOrder(TreeNode* root) {
if (root == NULL) {
return;
}
inOrder(root->left);
drawNode(root->val, root->val * DISTANCE_Y, root->val);
if (root->left) {
drawEdge(root->val, root->val * DISTANCE_Y, root->left->val, root->left->val * DISTANCE_Y);
}
if (root->right) {
drawEdge(root->val, root->val * DISTANCE_Y, root->right->val, root->right->val * DISTANCE_Y);
}
inOrder(root->right);
}
// 递归后序遍历
void postOrder(TreeNode* root) {
if (root == NULL) {
return;
}
postOrder(root->left);
postOrder(root->right);
drawNode(root->val, root->val * DISTANCE_Y, root->val);
if (root->left) {
drawEdge(root->val, root->val * DISTANCE_Y, root->left->val, root->left->val * DISTANCE_Y);
}
if (root->right) {
drawEdge(root->val, root->val * DISTANCE_Y, root->right->val, root->right->val * DISTANCE_Y);
}
}
// 层序遍历
void levelOrder(TreeNode* root) {
if (root == NULL) {
return;
}
queue<TreeNode*> q;
q.push(root);
while (!q.empty()) {
TreeNode* node = q.front();
q.pop();
drawNode(node->val, node->val * DISTANCE_Y, node->val);
if (node->left) {
drawEdge(node->val, node->val * DISTANCE_Y, node->left->val, node->left->val * DISTANCE_Y);
q.push(node->left);
}
if (node->right) {
drawEdge(node->val, node->val * DISTANCE_Y, node->right->val, node->right->val * DISTANCE_Y);
q.push(node->right);
}
}
}
int main() {
initgraph(WIDTH, HEIGHT); // 初始化图形窗口
setbkcolor(WHITE); // 设置背景颜色
cleardevice(); // 清屏
TreeNode* root = new TreeNode(1);
root->left = new TreeNode(2);
root->right = new TreeNode(3);
root->left->left = new TreeNode(4);
root->left->right = new TreeNode(5);
root->right->left = new TreeNode(6);
root->right->right = new TreeNode(7);
//preOrder(root);
//inOrder(root);
//postOrder(root);
levelOrder(root);
getch(); // 暂停窗口
closegraph(); // 关闭图形窗口
return 0;
}
```
在Visual Studio中,需要配置easyx头文件和库文件路径,否则编译会出错。具体方法可以参考easyx官方文档或者网上其他教程。