0
点赞
收藏
分享

微信扫一扫

【二叉树】二叉树的深度优先遍历DFS(前中后序遍历)和广度优先遍历BFS(层序遍历)详解【力扣144,94,145,102】【超详细的保姆级别教学】

【二叉树】二叉树的深度优先遍历(前中后序遍历)和广度优先遍历(层序遍历)详解【超详细的保姆级别教学】

先赞后看好习惯 打字不容易,这都是很用心做的,希望得到支持你 大家的点赞和支持对于我来说是一种非常重要的动力 看完之后别忘记关注我哦!️️️

博主这里提供题目的传送门:学完的伙伴可以顺便去力扣把题给做了。但是我们要注意的是,学会这些遍历方法才是重点,而不是单纯地把题目做完。

文章目录

树的结构

//取自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遍历有了一定的认识和了解了。这些都是我们学习数据结构最最基础的东西,也是必不可少的知识,我们必须掌握。如果你感觉这篇文章对你有帮助的话,不要忘了点赞关注和收藏哦!

举报

相关推荐

0 条评论