102. 二叉树的层序遍历 ●●
描述
给你二叉树的根节点 root ,返回其节点值的 层序遍历 。(即逐层地,从左到右访问所有节点)。
示例
输入:root = [3,9,20,null,null,15,7]
输出:[[3],[9,20],[15,7]]
题解
1. 队列 层序遍历 BFS
遍历过程中,严格按照一层一层,从左往右进行访问。
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> ans;
if(root == nullptr) return ans;
queue<TreeNode*> que;
TreeNode* curr = root;
que.push(curr);
while(!que.empty()){
int size = que.size(); // 每层个数就是队列元素个数
vector<int> sub;
for(int i = 0; i < size; ++i){
curr = que.front();
que.pop();
sub.emplace_back(curr->val);
if(curr->left) que.push(curr->left);
if(curr->right) que.push(curr->right);
}
ans.emplace_back(sub);
}
return ans;
}
};
2. DFS 递归
遍历过程中不按照严格层序进行遍历。
class Solution {
public:
vector<vector<int>> ans;
void traversal(TreeNode* node, int depth){
if(node == nullptr) return;
if(depth == ans.size()) ans.emplace_back(); // 当前节点层数大于数组长度时,扩容
ans[depth].emplace_back(node->val);
traversal(node->left, depth+1);
traversal(node->right, depth+1);
}
vector<vector<int>> levelOrder(TreeNode* root) {
traversal(root, 0); // 根节点为第0层
return ans;
}
};
107. 二叉树的层序遍历 II ●●
描述
给你二叉树的根节点 root ,返回其节点值 自底向上 的层序遍历 。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)
示例
输入:root = [3,9,20,null,null,15,7]
输出:[[15,7],[9,20],[3]]
题解
1. 队列 层序遍历 BFS
遍历过程中,严格按照一层一层,从左往右进行访问;最终将数组反转 reverse
。
class Solution {
public:
vector<vector<int>> levelOrderBottom(TreeNode* root) {
vector<vector<int>> ans;
if(root == nullptr) return ans;
queue<TreeNode*> que;
que.push(root);
while(!que.empty()){
int num = que.size(); // 新一层的节点个数
ans.emplace_back();
for(int i = 1; i <= num; ++i){ // 遍历一层
TreeNode* curr = que.front();
que.pop();
ans.back().emplace_back(curr->val);
if(curr->left) que.push(curr->left); // 左孩子入列
if(curr->right) que.push(curr->right); // 右孩子入列
}
}
reverse(ans.begin(), ans.end()); // 数组翻转
return ans;
}
};
2. DFS 递归
遍历过程中不按照严格层序进行遍历。
class Solution {
public:
void dfs(TreeNode* curr, int depth, vector<vector<int>> &ans){
if(depth > ans.size()) ans.emplace_back(); // 数组扩容
ans[depth-1].emplace_back(curr->val);
if(curr->left) dfs(curr->left, depth+1, ans); // 递归左孩子
if(curr->right) dfs(curr->right, depth+1, ans); // 递归右孩子
}
vector<vector<int>> levelOrderBottom(TreeNode* root) {
vector<vector<int>> ans;
if(root == nullptr) return ans;
dfs(root, 1, ans);
reverse(ans.begin(), ans.end());
return ans;
}
};