
剑指offer Leetcode 32-I 二叉树的层序遍历
初始化队列:将根节点加入队列。 遍历队列:在每一轮循环中,获取当前队列的大小(即当前层的节点数)。 处理当前层节点:从队列中取出所有当前层的节点,记录其值,并将其左、右子节点加入队列。 收集结果:将当前层的节点值存储在结果向量中。 初始化队列:将根节点加入队列。 遍历队列:在每一轮循环中,获取当前队列的大小。 处理当前层节点:从队列中取出所有当前层的节点,记录其值,并将其左、右子节点加入队列。 倒序存储结果:将当前层的节点值倒序存储到结果向量中。 初始化队列:将根节点加入队列。 遍历队列:在每一轮循环中,获取当前队列的大小。 处理当前层节点:从队列中取出所有当前层的节点,记录其值,并将其左、右子节点加入队列。 交替倒序存储结果:根据循环次数决定当前层是否倒序存储节点值。
发布日期:2021-05-06 23:39:38
浏览次数:19
分类:精选文章
本文共 2784 字,大约阅读时间需要 9 分钟。
层序遍历
单层向量实现
思路
层序遍历是一种常见的树遍历方式,通常用于前序、后序或层序访问树节点。以下是实现层序遍历的单层向量方法。
解法
该方法通过队列来控制节点的访问顺序。具体步骤如下:
代码示例
#include#include using namespace std;vector levelOrder(TreeNode* root) { if (root == nullptr) return {}; vector res; queue(TreeNode*> my_queue; my_queue.push(root); while (!my_queue.empty()) { int size = my_queue.size(); vector tmp; while (size--) { TreeNode* cur = my_queue.front(); my_queue.pop(); tmp.push_back(cur->val); if (cur->left) my_queue.push(cur->left); if (cur->right) my_queue.push(cur->right); } res.push_back(vector (tmp.rbegin(), tmp.rend())); } return res;}
双层向量实现
思路
该方法与单层向量实现类似,但每次遍历时将当前层的节点值倒序存储到结果向量中。
解法
代码示例
#include#include using namespace std;vector > levelOrder(TreeNode* root) { if (root == nullptr) return {}; vector > res; queue my_queue; my_queue.push(root); bool reverse = false; while (!my_queue.empty()) { int size = my_queue.size(); vector tmp; while (size--) { TreeNode* cur = my_queue.front(); my_queue.pop(); tmp.push_back(cur->val); if (cur->left) my_queue.push(cur->left); if (cur->right) my_queue.push(cur->right); } if (reverse) { res.push_back(vector (tmp.rbegin(), tmp.rend())); } else { res.push_back(tmp); } reverse = !reverse; } return res;}
之字型双层向量实现
思路
该方法通过在层序遍历中每层交替倒序和正序存储节点值,形成之字型的结果。
解法
代码示例
#include#include using namespace std;vector > levelOrder(TreeNode* root) { if (root == nullptr) return {}; vector > res; queue my_queue; my_queue.push(root); bool reverse = false; while (!my_queue.empty()) { int size = my_queue.size(); vector tmp; while (size--) { TreeNode* cur = my_queue.front(); my_queue.pop(); tmp.push_back(cur->val); if (cur->left) my_queue.push(cur->left); if (cur->right) my_queue.push(cur->right); } if (reverse) { res.push_back(vector (tmp.rbegin(), tmp.rend())); } else { res.push_back(tmp); } reverse = !reverse; } return res;}
这些方法通过队列和向量巧妙地控制了树节点的遍历顺序,实现了层序遍历的不同风格。
发表评论
最新留言
哈哈,博客排版真的漂亮呢~
[***.90.31.176]2025年04月09日 23时54分25秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
关于JTAG,你知道的和不知道的都在这里
2019-03-05
【CTF】CTFHub 技能树 文件头检查 writeup
2019-03-05
web服务器-并发服务器2
2019-03-05
【算法】解析位运算
2019-03-05
【SqlServer】如何把本地SqlServer数据库部署到远程服务器上
2019-03-05
【ASP.NET】ASP.NET中权限验证使用OnAuthorization实现
2019-03-05
第9章 用户自己建立数据类型
2019-03-05
02、MySQL—数据库基本操作
2019-03-05
RedHat Linux-配置YUM仓库
2019-03-05
Redis数据类型
2019-03-05
1907: 树的路径覆盖
2019-03-05
OpenJDK1.8.0 源码解析————HashMap的实现(一)
2019-03-05
MySQL-时区导致的时间前后端不一致
2019-03-05
2021-04-05阅读小笔记:局部性原理
2019-03-05
将Java编译为本地代码
2019-03-05
go语言简单介绍,增强了解
2019-03-05
2.1 Kubernetes--Pod
2019-03-05
python file文件操作--内置对象open
2019-03-05