今天来盘一盘 **遍历 ** 这类题目
使用python刷题分类整理的笔记,请参考: https://github.com/lxztju/leetcode-algorithm/tree/v1
层次遍历(BFS)
深度优先遍历(DFS)
宽度优先遍历(BFS)采用队列的方式,依次遍历一棵树。
基本的套路代码,就是102题目
中的代码思路。
BFS
class Solution {
public:
vector> levelOrder(TreeNode* root) {
if (root == nullptr) return {};
// 使用队列存储节点与节点所对应的层次
queue> nodeQ;
vector> res;
// 将根节点以及对应的层次0,入队
nodeQ.push(make_pair(root, 0));
// 如果队列不为空,就一直遍历队列元素
while (!nodeQ.empty()){
// 拿出队首的节点指针以及层次
auto nodeLevel = nodeQ.front();
auto nodePoint = nodeLevel.first;
int level = nodeLevel.second;
nodeQ.pop(); // 队首元素出队
if (res.size() <= level){
res.push_back({});
}
res[level].push_back(nodePoint->val);
// 如果左子树存在,就将左子节点入队
if (nodePoint->left){
nodeQ.push(make_pair(nodePoint->left, level+1));
}
// 如果右子树存在,就将右子节点入队
if (nodePoint->right){
nodeQ.push(make_pair(nodePoint->right, level+1));
}
}
return res;
}
};
与上一题一致
class Solution {
public:
vector averageOfLevels(TreeNode* root) {
if (! root) return {};
vector nodesum;
vector cnt;
queue> nodeQ;
nodeQ.push(make_pair(root, 0));
while (!nodeQ.empty()){
// 拿出队首的节点指针以及层次
auto nodeLevel = nodeQ.front();
auto nodePoint = nodeLevel.first;
int level = nodeLevel.second;
nodeQ.pop(); // 队首元素出队
if (nodesum.size() <= level){
nodesum.push_back(nodePoint->val);
cnt.push_back(1);
}
else{
nodesum[level] += nodePoint->val;
cnt[level]++;
}
// 如果左子树存在,就将左子节点入队
if (nodePoint->left){
nodeQ.push(make_pair(nodePoint->left, level+1));
}
// 如果右子树存在,就将右子节点入队
if (nodePoint->right){
nodeQ.push(make_pair(nodePoint->right, level+1));
}
}
for (int i = 0; i< nodesum.size(); i++){
nodesum[i] /= cnt[i];
}
return nodesum;
}
};
class Solution {
public:
int findBottomLeftValue(TreeNode* root) {
if (root == nullptr) return {};
// 使用队列存储节点与节点所对应的层次
queue> nodeQ;
// pair的第一个参数为每层的第一个节点值,第二个参数为层次
pair res(0, -1);
// 将根节点以及对应的层次0,入队
nodeQ.push(make_pair(root, 0));
// 如果队列不为空,就一直遍历队列元素
while (!nodeQ.empty()){
// 拿出队首的节点指针以及层次
auto nodeLevel = nodeQ.front();
auto nodePoint = nodeLevel.first;
int level = nodeLevel.second;
nodeQ.pop(); // 队首元素出队
// 如果开始了一个新的层次,将在这一层最左侧的元素保存。
if (level > res.second){
res.first = nodePoint->val;
res.second = level;
}
// 如果左子树存在,就将左子节点入队
if (nodePoint->left){
nodeQ.push(make_pair(nodePoint->left, level+1));
}
// 如果右子树存在,就将右子节点入队
if (nodePoint->right){
nodeQ.push(make_pair(nodePoint->right, level+1));
}
}
return res.first;
}
};
深度优先遍历(DFS)就是递归访问一棵树。
前序遍历: 根——左——右
class Solution {
public:
vector preorderTraversal(TreeNode* root) {
vector res;
preorder(root, res);
return res;
}
void preorder(TreeNode* root, vector& res){
if (root == nullptr) return;
res.push_back(root->val);
preorder(root->left, res);
preorder(root->right, res);
}
};
后序遍历: 左——右——根
class Solution {
public:
vector postorderTraversal(TreeNode* root) {
vector res;
postorder(root, res);
return res;
}
void postorder(TreeNode* root, vector& res){
if (root == nullptr) return;
postorder(root->left, res);
postorder(root->right, res);
res.push_back(root->val);
}
};
中序遍历: 左——根——右
class Solution {
public:
vector inorderTraversal(TreeNode* root) {
vector res;
inorder(root, res);
return res;
}
void inorder(TreeNode* root, vector & res){
if (root == nullptr) return ;
inorder(root->left, res);
res.push_back(root->val);
inorder(root->right, res);
}
};
微信公众号: 小哲AI
GitHub地址: https://github.com/lxztju/leetcode-algorithm
csdn博客: https://blog.csdn.net/lxztju
知乎专栏: 小哲AI
AI研习社专栏:小哲AI