深度优先搜索(DFS)
一、深搜简介
深搜主要使用的是递归的方式,从一个点开始不断往里搜索也就是递归中的递,当遇到不符合条件的或者目标对象时候就进行归。
主要用与遍历或树和图的搜索算法,在这个过程中我们同样可以使用栈来解决。粗略的理解就是一条路走到黑。
1.原理
图示:
上图演示了在树中查找数字5的过程,可以明显的看到,它先是一直往深处搜索,直到为空
再不断的往后回退,退到有新的分支出现,就对新的分支进行搜索。
二、代码演示
1.dfs在二叉树中的运用是非常多的,最常见的就是前,中,后序遍历
#include<iostream> #include<vector> /*二叉树中序遍历*/ 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) {} }; class Solution { public: void inorder(TreeNode *root,std::vector<int> &v) { if(root == nullptr)return ; //如果不为空就继续遍历左子树 inorder(root->left,v); //为空就输出值 v.push_back(root->val); //值输出后,再遍历右子树 inorder(root->right,v); } std::vector<int> inorderTraversal(TreeNode* root) { std::vector<int>v; inorder(root,v); return v; } };
在inorder这个函数中我们可以看到,如果当前节点不为空,我们先再调用inorder接着遍历它的左子树直到节点为空,然后再输出值,最后遍历右子树。