【二叉树】二叉树的深度优先遍历(前中后序遍历)和广度优先遍历(层序遍历)详解【超详细的保姆级别教学】
先赞后看好习惯 打字不容易,这都是很用心做的,希望得到支持你 大家的点赞和支持对于我来说是一种非常重要的动力 看完之后别忘记关注我哦!️️️
博主这里提供题目的传送门:学完的伙伴可以顺便去力扣把题给做了。但是我们要注意的是,学会这些遍历方法才是重点,而不是单纯地把题目做完。
文章目录
树的结构
//取自leetcode
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
深度优先遍历(DFS)
什么是深度优先遍历
关于DFS深度优先遍历,我们可以使用递归法和非递归法,这里展示的是递归法,以后博主可能还会补充非递归法的过程。伙伴们持续关注哦~
前序遍历
知道思路,我们可以写代码了:
class Solution {
public:
//前序遍历
void preordertraversal(TreeNode* cur, vector<int>& vec) {
//确定终止条件
if (cur == NULL) {
return;
}
//确定单层递归的逻辑
vec.push_back(cur->val);
preordertraversal(cur->left, vec);
preordertraversal(cur->right, vec);
}
};
中序遍历和后序遍历
中序遍历:
//中序遍历
class Solution {
public:
void inOrder(TreeNode* root, vector<int>& res) {
if (!root) {
return;
}
//就是下面三者顺序调整一下而已
inOrder(root->left, res);
res.push_back(root->val);//放中间
inOrder(root->right, res);
}
vector<int> inorderTraversal(TreeNode* root) {
vector<int> res;
inorder(root, res);
return res;
}
};
后序遍历:
//后序遍历:
class Solution {
public:
void postOrder(TreeNode*root,vector<int>&ret){
if(root==NULL)return;
postOrder(root->left,ret);
postOrder(root->right,ret);
ret.push_back(root->val);
}
vector<int> postorderTraversal(TreeNode* root) {
vector<int>ret;
postOrder(root,ret);
return ret;
}
};
广度优先遍历(BFS)
非递归遍历
二叉树的层序遍历需要用到队列的知识,暂时没学过队列的伙伴可以通过传送门先学习队列,再继续食用本篇~【栈和队列】纯C实现栈和队列以及其基本操作-宝藏级别数据结构教程【保姆级别详细教学】
层序遍历:
//结果插入vector中
class Solution {
private:
vector<vector<int>>ret;
public:
vector<vector<int>> levelOrder(BTNode* root) {
if (!root) {
return ret;
}
queue<BTNode*>q;//队列存地址
q.push(root);
while (!q.empty()) {//队列为空,结束遍历
int curentLevalSize = q.size();
ret.push_back(vector <int>());//这里指的是二维数组的行地址
for (int i = 0; i < curentLevalSize; i++) {
BTNode* node = q.front();//先保存队头元素,否则弹走了就找不到了
q.pop();//每次都要弹出一个元素
ret.back().push_back(node->data);//将数据push进结果数组里
//如果左边不为空,把左边push进队列
if (node->left) {
q.push(node->left);
}
//如果右边不为空,把右边push进队列
if (node->right) {
q.push(node->right);
}
}
}
return ret;
}
};
尾声
相信大家看到这里,已经对二叉树的DFS,BFS遍历有了一定的认识和了解了。这些都是我们学习数据结构最最基础的东西,也是必不可少的知识,我们必须掌握。如果你感觉这篇文章对你有帮助的话,不要忘了点赞关注和收藏哦!