迭代算法
使用队列,也是比较普遍的解法。
tips
通过记录队列的长度实现将每一层的节点分开。
代码
cpp
// ==========================================
// 方法一:迭代法 (BFS - 广度优先搜索)
// 核心思想:利用队列 (Queue) 先进先出的特性,一层一层地遍历
// ==========================================
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> result;
queue<TreeNode*> q; // 定义队列
if (root != NULL) q.push(root); // 初始化:将根节点入队
while (!q.empty()) {
int size = q.size(); // 【关键】记录当前层级的节点数量
vector<int> vec; // 存储当前这一层的所有节点值
// 遍历当前层的每一个节点
for (int i = 0; i < size; i++) {
TreeNode* node = q.front(); // 取出队首节点
q.pop();
vec.push_back(node->val); // 记录值
// 将左右子节点加入队列,作为下一层的数据等待处理
if (node->left) q.push(node->left);
if (node->right) q.push(node->right);
}
// 当前层处理完毕,将这一层的数组放入结果集中
result.push_back(vec);
}
return result;
}
递归算法
递归算法需要解决怎么知道遍历的节点是否在同一层,引入一个变量depth记录深度即可,将节点值直接压入result二维数组即可。
tips
将节点值压入result时一定防止访问越界,要提前创建好,即if(result.size == depth) result.push_back(vector<int>())
代码
cpp
// ==========================================
// 方法二:递归法 (DFS - 深度优先搜索)
// 核心思想:增加一个参数记录层数,可以识别是否在同一层
// ==========================================
void order(TreeNode* node, vector<vector<int>>& result, int depth) {
if (node == NULL) return; // 递归终止条件
// 【关键】如果 result 的大小等于当前深度,说明 result 还没创建这一层
// 需要新压入一个空的 vector 来存放这一层的数据
if (result.size() == depth) {
result.push_back(vector<int>());
}
// 根据 depth,将当前节点值放入对应的层级数组中
result[depth].push_back(node->val);
// 递归处理左子树和右子树,深度 +1
if (node->left) order(node->left, result, depth + 1);
if (node->right) order(node->right, result, depth + 1);
}
vector<vector<int>> levelOrder_(TreeNode* root) {
vector<vector<int>> result;
int depth = 0;
order(root, result, depth); // 启动递归
return result;
}