层序遍历二叉树可视化easyx代码,改变遍历的节点的颜色

时间: 2023-09-15 08:06:05 浏览: 92
### 回答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; }

相关推荐

最新推荐

recommend-type

树和二叉树-层序遍历二叉树 

1 已知二叉树以二叉链表作为存储结构,写一个算法按层序遍历它,通过程序在终端屏幕上打印出它的层序序列。 2 先建立二叉树的二叉链表存储结构,再遍历它。 3 利用队列完成算法。
recommend-type

STM32F103使用flash模拟eeprom

STM32F103 使用内部flash模拟eeprom。使用官方文件,已验证可行。直接拿使用。
recommend-type

若依框架管理系统研究生辅助科研管理系统

若依框架管理系统研究生辅助科研管理系统
recommend-type

scratch2源码接鸡蛋

scratch2源码接鸡蛋提取方式是百度网盘分享地址
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

MATLAB柱状图在信号处理中的应用:可视化信号特征和频谱分析

![matlab画柱状图](https://img-blog.csdnimg.cn/3f32348f1c9c4481a6f5931993732f97.png) # 1. MATLAB柱状图概述** MATLAB柱状图是一种图形化工具,用于可视化数据中不同类别或组的分布情况。它通过绘制垂直条形来表示每个类别或组中的数据值。柱状图在信号处理中广泛用于可视化信号特征和进行频谱分析。 柱状图的优点在于其简单易懂,能够直观地展示数据分布。在信号处理中,柱状图可以帮助工程师识别信号中的模式、趋势和异常情况,从而为信号分析和处理提供有价值的见解。 # 2. 柱状图在信号处理中的应用 柱状图在信号处理
recommend-type

get() { return this.photoState },

这是一个 JavaScript 中的方法定义,它定义了一个名为 `get` 的方法。这个方法没有参数,它返回了 `this.photoState`。在这个方法中,`this` 是指当前对象,而 `photoState` 是该对象的一个属性。通常情况下,`get` 方法用于获取对象的属性值,并且可以在获取属性值之前进行一些逻辑操作。
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。
recommend-type

"互动学习:行动中的多样性与论文攻读经历"

多样性她- 事实上SCI NCES你的时间表ECOLEDO C Tora SC和NCESPOUR l’Ingén学习互动,互动学习以行动为中心的强化学习学会互动,互动学习,以行动为中心的强化学习计算机科学博士论文于2021年9月28日在Villeneuve d'Asq公开支持马修·瑟林评审团主席法布里斯·勒菲弗尔阿维尼翁大学教授论文指导奥利维尔·皮耶昆谷歌研究教授:智囊团论文联合主任菲利普·普雷教授,大学。里尔/CRISTAL/因里亚报告员奥利维耶·西格德索邦大学报告员卢多维奇·德诺耶教授,Facebook /索邦大学审查员越南圣迈IMT Atlantic高级讲师邀请弗洛里安·斯特鲁布博士,Deepmind对于那些及时看到自己错误的人...3谢谢你首先,我要感谢我的两位博士生导师Olivier和Philippe。奥利维尔,"站在巨人的肩膀上"这句话对你来说完全有意义了。从科学上讲,你知道在这篇论文的(许多)错误中,你是我可以依