初入算法(四) -BFS(广度遍历) DFS(深度遍历)

搜索或者遍历主要涉及以下三点内容

  • 每个节点都要访问一次

  • 每个节点仅仅访问一次

  • 对于节点的访问顺序不同可以分为

    • 广度优先遍历
    • 深度优先遍历(Depth-First-Search)

深度优先遍历(DFS)

> 		 1 		
> 		/  \ 	 
> 	  2     5 	
>    /  \
>   3    4

(以上为执行顺序)

void DFS(TreeNode* root)
{
	if(root==nullptr)
		return;
	cout<<root->val<<" ";
	DFS(root->left);
	DFS(root->right); 
}

深度遍历可以用迭代和辅助栈的方式来实现。

广度优先遍历(BFS)

> 		 1
>  		/  \
>      2    3
>     / \
>    4   5

(以上为执行顺序)

广度遍历就好比水滴,是层层深入,像水波一样向外扩散. 广度遍历一般使用队列的方式来实现

例题
给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。
例如:
给定二叉树: [3,9,20,null,null,15,7],

在这里插入图片描述
返回其层次遍历结果:
在这里插入图片描述
解法一(BFS)

vector<vector<int>> levelOrder(TreeNode* root) {
    if(root==nullptr)
        return {};
    queue<TreeNode*> _queue;
    vector<vector<int>> result;
    _queue.push(root);
    while (!_queue.empty()) {
        vector<int> temp;
        //通过当前队列的长度来判断右多少个值
        int length = _queue.size();
        for(int i=0;i<length;i++)
        {
            TreeNode* node = _queue.front();
            _queue.pop();

            temp.push_back(node->val);
            if(node->left) _queue.push(node->left);
            if(node->right) _queue.push(node->right);
        }
        result.push_back(temp);
    }
    return result;
}

解放二(DFS)
利用迭代来实现,其中最为关键的就是level

//层数level,tree root,contain result
void recursive(int level,TreeNode* root,vector<vector<int>> &result)
{
    //terminator
    if(root==nullptr)
        return;
    if(result.size() == level) result.resize(level+1);
    result[level].push_back(root->val);
    recursive(level+1,root->left,result);
    recursive(level+1,root->right,result);
}
//dfs来完成
vector<vector<int>> levelOrder(TreeNode* root){
    if(root==nullptr)
        return {};
    vector<vector<int>> result;
    recursive(1,root,result);
    return result;
}
发布了17 篇原创文章 · 获赞 3 · 访问量 416

猜你喜欢

转载自blog.csdn.net/qq_41172631/article/details/105169756