树上的BFS与DFS

树上的BFS与DFS

bfs与之前学习的没有什么不同,主要就是对树的层序遍历

dfs是比较抽象的,一般比较难想而且时间复杂度相对于bfs来说会更高。

例题:

1. 二叉树的锯齿形层序遍历

https://leetcode-cn.com/problems/binary-tree-zigzag-level-order-traversal/

思路:用双端队列来维护入队和出队的节点。

class Solution {
public:
    vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
        vector<vector<int>> ans;
        if(root == nullptr) return ans;
        deque<TreeNode*>q;
        q.push_back(root);
        int flag = 0;
        while(!q.empty()){
            int n = q.size();
            vector<int>tmp;
            for(int i=0;i<n;i++){    
                if(flag & 1){
                    TreeNode* p = q.back();
                    q.pop_back();
                    tmp.push_back(p->val);
                    if(p->right != nullptr) q.push_front(p->right);
                    if(p->left != nullptr) q.push_front(p->left);
                }
                else{
                    TreeNode* p = q.front();
                    q.pop_front();
                    tmp.push_back(p->val);
                    if(p->left != nullptr) q.push_back(p->left);
                    if(p->right != nullptr) q.push_back(p->right); 
                }
            }
            flag++;
            ans.push_back(tmp);
        }
        return ans;   
    }
};

2.目标和

https://leetcode-cn.com/problems/target-sum/

给定一个非负整数数组,a1, a2, ..., an, 和一个目标数,S。现在你有两个符号 + 和 -。对于数组中的任意一个整数,你都可以从 + 或 -中选择一个符号添加在前面。

返回可以使最终数组和为目标数 S 的所有添加符号的方法数。

思路:dfs找到可行解

class Solution {
public:
    int findTargetSumWays(vector<int>& nums, int S) {
        return findTarget(nums, 0, (long)S);
    }

    long findTarget(vector<int> &nums, int index, long target) {
        if(index == nums.size()) {
            return target == 0 ? 1 : 0;
        }

        return findTarget(nums, index+1, target + nums[index])
        + findTarget(nums, index+1, target - nums[index]);
    }
};

posted @ 2021-02-06 14:16  voids5  阅读(127)  评论(0编辑  收藏  举报