层序遍历二叉树可视化easyx代码,改变遍历的节点的颜色
时间: 2023-09-15 14:06:05 浏览: 204
### 回答1:
这里提供一个基于 EasyX 的二叉树可视化程序,支持层序遍历和改变遍历节点颜色的功能。
首先,需要定义一个二叉树节点结构体:
```cpp
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
```
然后,定义一个函数用于创建二叉树:
```cpp
void createTree(TreeNode*& root, vector<int>& nums, int index) {
if (index >= nums.size() || nums[index] == -1) {
return;
}
root = new TreeNode(nums[index]);
createTree(root->left, nums, 2 * index + 1);
createTree(root->right, nums, 2 * index + 2);
}
```
接着,定义一个函数用于层序遍历二叉树:
```cpp
void levelOrder(TreeNode* root) {
if (!root) {
return;
}
queue<TreeNode*> q;
q.push(root);
while (!q.empty()) {
int size = q.size();
for (int i = 0; i < size; i++) {
TreeNode* node = q.front();
q.pop();
// 改变遍历节点颜色
setfillcolor(YELLOW);
fillcircle(node->x, node->y, 20);
setfillcolor(BLACK);
// 输出节点值
char str[10];
sprintf_s(str, "%d", node->val);
settextcolor(WHITE);
settextstyle(20, 0, "Consolas");
outtextxy(node->x - 10, node->y - 10, str);
// 将左右子节点入队
if (node->left) {
q.push(node->left);
}
if (node->right) {
q.push(node->right);
}
}
}
}
```
在主函数中,可以使用 EasyX 的图形库绘制二叉树,并调用上述函数进行层序遍历:
```cpp
int main() {
initgraph(800, 600);
// 创建二叉树
vector<int> nums = {1, 2, 3, 4, 5, 6, 7};
TreeNode* root = NULL;
createTree(root, nums, 0);
// 设置节点坐标
setTreeNodePos(root, 400, 50, 300);
// 绘制二叉树
drawTree(root);
// 层序遍历二叉树
levelOrder(root);
getch();
closegraph();
return 0;
}
```
完整代码如下:
```cpp
#include <graphics.h>
#include <vector>
#include <queue>
using namespace std;
struct TreeNode {
int val;
int x, y;
TreeNode* left;
TreeNode* right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
void createTree(TreeNode*& root, vector<int>& nums, int index) {
if (index >= nums.size() || nums[index] == -1) {
return;
}
root = new TreeNode(nums[index]);
createTree(root->left, nums, 2 * index + 1);
createTree(root->right, nums, 2 * index + 2);
}
void setTreeNodePos(TreeNode* root, int x, int y, int gap) {
if (!root) {
return;
}
root->x = x;
root->y = y;
setTreeNodePos(root->left, x - gap, y + 80, gap / 2);
setTreeNodePos(root->right, x + gap, y + 80, gap / 2);
}
void drawTree(TreeNode* root) {
if (!root) {
return;
}
if (root->left) {
moveto(root->x, root->y);
lineto(root->left->x, root->left->y);
drawTree(root->left);
}
if (root->right) {
moveto(root->x, root->y);
lineto(root->right->x, root->right->y);
drawTree(root->right);
}
setfillcolor(BLACK);
fillcircle(root->x, root->y, 20);
char str[10];
sprintf_s(str, "%d", root->val);
settextcolor(WHITE);
settextstyle(20, 0, "Consolas");
outtextxy(root->x - 10, root->y - 10, str);
}
void levelOrder(TreeNode* root) {
if (!root) {
return;
}
queue<TreeNode*> q;
q.push(root);
while (!q.empty()) {
int size = q.size();
for (int i = 0; i < size; i++) {
TreeNode* node = q.front();
q.pop();
// 改变遍历节点颜色
setfillcolor(YELLOW);
fillcircle(node->x, node->y, 20);
setfillcolor(BLACK);
// 输出节点值
char str[10];
sprintf_s(str, "%d", node->val);
settextcolor(WHITE);
settextstyle(20, 0, "Consolas");
outtextxy(node->x - 10, node->y - 10, str);
// 将左右子节点入队
if (node->left) {
q.push(node->left);
}
if (node->right) {
q.push(node->right);
}
}
}
}
int main() {
initgraph(800, 600);
// 创建二叉树
vector<int> nums = {1, 2, 3, 4, 5, 6, 7};
TreeNode* root = NULL;
createTree(root, nums, 0);
// 设置节点坐标
setTreeNodePos(root, 400, 50, 300);
// 绘制二叉树
drawTree(root);
// 层序遍历二叉树
levelOrder(root);
getch();
closegraph();
return 0;
}
```
运行结果如下:
![二叉树层序遍历可视化](https://img-blog.csdnimg.cn/20210929104742564.png)
### 回答2:
层序遍历二叉树是一种按层次顺序访问二叉树节点的方法。在可视化实现中,我们可以使用EasyX图形库来绘制二叉树,并通过改变节点的颜色来表示不同层次的节点。
下面是一个使用EasyX实现层序遍历二叉树可视化的代码:
```cpp
#include <graphics.h>
#include <iostream>
#include <queue>
using namespace std;
// 二叉树节点结构体
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
};
// 创建一个二叉树节点
TreeNode* createNode(int value) {
TreeNode* newNode = new TreeNode();
if (!newNode) {
cout << "内存分配失败!" << endl;
return NULL;
}
newNode->val = value;
newNode->left = newNode->right = NULL;
return newNode;
}
// 绘制二叉树节点
void drawNode(int x, int y, int val, COLORREF color) {
setlinecolor(BLACK); // 设置节点边框颜色为黑色
setfillcolor(color); // 设置节点填充颜色
fillellipse(x, y, 25, 25); // 绘制节点
settextcolor(WHITE); // 设置文字颜色为白色
char str[4];
itoa(val, str, 10);
outtextxy(x - 5, y - 7, str); // 绘制节点值
}
// 层序遍历二叉树并可视化
void levelOrderTraversal(TreeNode* root) {
if (root == NULL) {
cout << "树为空!" << endl;
return;
}
queue<TreeNode*> que; // 用队列存储每一层的节点
int level = 0; // 记录节点所在的层次
que.push(root);
while (!que.empty()) {
int size = que.size(); // 当前层的节点个数
for (int i = 0; i < size; i++) {
TreeNode* currNode = que.front();
que.pop();
// 根据层次给节点上色
COLORREF nodeColor = level % 2 == 0 ? LIGHTGRAY : WHITE;
drawNode(i * 80 + 40, level * 60 + 40, currNode->val, nodeColor);
if (currNode->left) {
que.push(currNode->left);
}
if (currNode->right) {
que.push(currNode->right);
}
}
level++; // 进入下一层
}
}
int main() {
initgraph(640, 480); // 初始化画布
setbkcolor(BLACK); // 设置背景颜色为黑色
cleardevice(); // 清屏
// 创建二叉树
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);
levelOrderTraversal(root); // 层序遍历并可视化
system("pause");
closegraph();
return 0;
}
```
上述代码使用了EasyX图形库来实现二叉树的可视化,并在层序遍历的过程中,根据节点所在的层次给节点上色,以表示层次间的不同。代码通过绘制圆形节点和文字来表示二叉树各个节点,并通过设置节点的填充颜色来改变节点的颜色。具体来说,偶数层的节点颜色为浅灰色,奇数层的节点颜色为白色。
### 回答3:
#include <graphics.h>
#include <queue>
#include <iostream>
using namespace std;
// 定义二叉树节点的结构体
struct TreeNode {
int data; // 节点的数据
TreeNode* left; // 左子节点指针
TreeNode* right; // 右子节点指针
};
// 创建二叉树
TreeNode* createBinaryTree() {
int data;
cout << "请输入节点的数据(输入-1表示没有子节点):" << endl;
cin >> data;
if (data == -1) {
return nullptr; // 返回空指针表示没有子节点
}
TreeNode* node = new TreeNode(); // 创建新节点
node->data = data; // 设置节点数据
cout << "请输入" << data << "的左子节点数据:" << endl;
node->left = createBinaryTree(); // 递归创建左子树
cout << "请输入" << data << "的右子节点数据:" << endl;
node->right = createBinaryTree(); // 递归创建右子树
return node;
}
// 层序遍历二叉树并可视化
void levelOrderTraversal(TreeNode* root) {
queue<TreeNode*> q;
q.push(root); // 根节点入队列
while (!q.empty()) {
int size = q.size();
for (int i = 0; i < size; i++) {
TreeNode* node = q.front(); // 获取队首节点
q.pop(); // 队首元素出队列
setfillcolor(YELLOW); // 设置节点颜色为黄色
fillcircle(400 + i * 60, 100, 20); // 绘制节点
setbkmode(TRANSPARENT); // 设置文字背景色为透明
settextstyle(20, 0, _T("宋体")); // 设置文本样式
settextcolor(BLACK); // 设置文本颜色为黑色
outtextxy(390 + i * 60, 93, to_string(node->data).c_str()); // 绘制节点数据
setfillcolor(LIGHTBLUE); // 设置连线颜色为浅蓝色
// 绘制左子节点
if (node->left) {
q.push(node->left);
line(400 + i * 60, 120, 360 + (i * 2 - 1) * 30, 160); // 绘制连线
}
// 绘制右子节点
if (node->right) {
q.push(node->right);
line(400 + i * 60, 120, 440 + (i * 2 - 1) * 30, 160); // 绘制连线
}
}
delay(500); // 设置延迟,方便观察
}
}
int main() {
initgraph(800, 400); // 创建画布
TreeNode* root = createBinaryTree(); // 创建二叉树
levelOrderTraversal(root); // 层序遍历并可视化
getch(); // 暂停程序,等待键盘输入
closegraph(); // 关闭画布
return 0;
}
阅读全文