当前位置: 首页 > news >正文

多叉树定义与遍历-----从零开始的数据结构

一.多叉树的定义:

• 多叉树本质上就是二叉树的延申,二叉树是特殊的多叉树

二叉树每一个节点都有两个子节点,那么 “多叉树” 每一个节点都有任意的子节点

用代码表示就是:

二叉树节点:

class TreeNode{ public: int val; TreeNode* left; TreeNode* right; TreeNode(int x) : val(x) , left(nullptr) , right(nullptr){} };

多叉树节点:任意的子节点-----用数组!

class TreeNode{ public: int val; vector<TreeNode*> children; };

二叉树相关知识:

二叉树---从零开始的数据结构学习-CSDN博客

二叉树遍历----从零开始的数据结构-CSDN博客

补充:森林的定义

森林就是多叉树的集合,单独一颗多叉树是特殊的森林。

代码表示: 用list列表

list<Node> forest;

每一个node都是一个多叉树的根节点

利用bfs和dfs从头节点遍历下去,是不是很像哈希表的遍历?

二.多叉树遍历

1.递归遍历(DFS):

class TreeNode{ public: int val; vector<TreeNode*> children; }; void traverse(TreeNode* root){ if (root == nullptr) return; //前序 for (TreeNode* child : root->children){ traverse(child); } //后序 }

前序在递归函数前面,后序在递归函数后

没有中序位置是因为可能会大于2,因此讨论中序没有意义

多叉树每一个节点的子节点在数组中刚好从左往右排列

2.层序遍历(BFS):

多叉树的层序遍历和二叉树的层序遍历相同。

写法一:最简单,不记录深度
#include<iostream> #include<vector> #include<queue> using namespace std; class TreeNode{ public: int val; vector<TreeNode*> children; }; void levelOrderTraverse(TreeNode* root){ if (root == nullptr) return; queue<TreeNode*> q; q.push(root); while(!q.empty()){ TreeNode* cur = q.front(); q.pop(); cout << cur->val << endl; for (TreeNode* temp : cur->children){ q.push(temp); } } }
写法二: 常规,记录深度
#include<iostream> #include<vector> #include<queue> using namespace std; class TreeNode{ public: int val; vector<TreeNode*> children; }; void levelOrderTraverse(TreeNode* root){ if (root == nullptr)return; int depth = 1;//深度 queue<TreeNode* > q; q.push(root); while(!q.empty()){ int size = q.size(); for (int i = 0; i < size; i++){ TreeNode* cur = q.front(); q.pop(); for (TreeNode* temp : cur->children){ q.push(temp); } } depth++; } }

每一层在队列中的元素出队之后,depth加一

写法三: 使用于不同路径权重的情况
#include<iostream> #include<vector> #include<queue> using namespace std; class TreeNode{ public: int val; vector<TreeNode*> children; }; class state{ public: TreeNode* Node; int depth;//路径 state(TreeNode* node, int depth) :Node(node) , depth(depth){} }; void levelOrderTraverse(TreeNode* root){ if (root == nullptr) return; queue<state> q; q.push(state(root,1)); //根节点深度当作1 while(!q.empty()){ state cur = q.front(); q.pop(); int depth = cur.depth; for (TreeNode* temp : cur.Node->children){ q.push(state(temp,depth+1)); } } }

每一个层路径节点默认比上一层多一,在不同情景中进行更改即可。

结语:

如果喜欢我的文章,不妨点一个免费的赞和收藏。

你们的支持都是我更新路上最大的动力

http://www.jsqmd.com/news/708565/

相关文章:

  • Padans按行、按列汇总
  • 免费开源下载管理利器:AB Download Manager 终极使用指南
  • kyu点差分元宝
  • nli-MiniLM2-L6-H768一文详解:蕴含/矛盾/中立三分类服务落地
  • 探讨高分子护栏选购,小水牛科技在上海地区的靠谱程度? - 工业推荐榜
  • Qwerty Learner:用打字练习重塑英语单词记忆的3大创新方法
  • 网络编程模型比较
  • Spring Boot项目里,除了Freemarker,试试Apache Velocity做动态内容生成(配置避坑指南)
  • CAPL诊断自动化避坑指南:从diagSendRequest到TestStepPass的完整流程解析
  • 5分钟掌握网盘直链下载助手:告别限速的终极解决方案
  • 2026年福州口碑好的装修公司推荐,福州百年祥业装饰工程公司全解析 - 工业推荐榜
  • OBS Composite Blur终极指南:如何用专业模糊插件提升直播与视频质量
  • VESTA隐藏玩法:用Objects侧边栏高效管理复杂晶体模型,科研效率翻倍
  • 测试消息
  • 指令解析失败、时序抖动超200μs、安全协议握手中断——MCP 2026适配三大致命缺陷全解析,附IEC 61131-3级修复补丁
  • Cursor Pro终极破解指南:三步实现AI编程助手永久免费使用
  • 如何在Windows上实现AirPlay 2投屏接收功能:终极免费解决方案指南
  • STM32 CubeMX HAL库驱动GY-302(BH1750)光照传感器,告别模拟I2C的繁琐配置
  • 【2026-04-24】连岳摘抄
  • 别再为手眼标定头秃了!用Python+Matlab搞定Realsense D435与UR5机械臂(附完整代码)
  • 聊聊2026年高压灯带正规供应商,哪家性价比高 - 工业推荐榜
  • shapeshifter 在 Android studio 的 使用和编辑 (AVD)
  • Open WebUI:构建企业级本地AI平台的架构实践
  • 撰写学术论文,有哪些推荐的实用工具? - AI论文先行者
  • VinXiangQi终极指南:7个高效实战技巧助你成为象棋AI高手
  • EASY-HWID-SPOOFER:内核级硬件指纹伪装架构设计与实现原理
  • 【2026-04-25】连岳摘抄
  • OmenSuperHub:突破性能限制的惠普游戏本终极控制方案
  • python生成工资条
  • 如何永久保存微信聊天记录:开源工具WeChatMsg完全指南