【算法题】二叉树中和为某一值的路径(二)

二叉树中和为某一值的路径(二)

https://www.nowcoder.com/practice/b736e784e3e34731af99065031301bca?tpId=196&tqId=37052&rp=1&sourceUrl=%2Fexam%2Foj%3FquestionJobId%3D10%26subTabName%3Donline_coding_page&difficulty=undefined&judgeStatus=undefined&tags=&title=

这题说的是找出所有路径和为 target 的路径,这里的路径只能从根节点到叶子节点,这题和上一题类似:《二叉树中和为某一值的路径》

我们从根节点开始往下累加路径上的节点值,并且还要记录这条路径上的节点,到叶子节点的时候如果累加的值等于 target ,说明这条路径就是我们找的,保存这条路径。

我们使用的是 List (Java语言使用的是List,C++使用的是Vector)来存储路径上的节点,因为它是引用传递,所以递归往下走的时候我们选择节点,递归往回走的时候要撤销选择

alt

    public ArrayList<ArrayList<Integer>> FindPath(TreeNode root, int target) {
        ArrayList<ArrayList<Integer>> ans = new ArrayList<>();
        dfs(root, target, 0, new ArrayList<>(), ans);
        return ans;
    }

    /**
     * @param node   当前节点
     * @param target
     * @param sum    从根节点到当前节点路径上的和
     * @param path   记录从根节点到当前节点路径上的节点值。
     * @param ans    返回的结果集。
     */
    public void dfs(TreeNode node, int target, int sum, List<Integer> path,
                    List<ArrayList<Integer>> ans) {
        if (node == null)
            return;
        path.add(node.val);// 记录该路径上的节点
        sum += node.val;// 累加从根节点到当前节点这条路径上所有节点的和。
        // 如果到达叶子节点,就不能往下走了,直接return
        if (node.left == null && node.right == null) {
            // 如果到达叶子节点,并且sum等于toal,说明我们找到了一组,
            // 要把它放到ans中
            if (target == sum)
                ans.add(new ArrayList<>(path));
        } else {
            dfs(node.left, target, sum, path, ans);// 递归到左子节点
            dfs(node.right, target, sum, path, ans);// 递归到右子节点
        }
        path.remove(path.size() - 1);// 往回走撤销选择
    }

public:
    vector<vector<int>> FindPath(TreeNode *root, int target) {
        vector<vector<int>> ans;
        vector<int> path;
        dfs(root, target, 0, path, ans);
        return ans;
    }

    /**
     * @param node   当前节点
     * @param target
     * @param sum    从根节点到当前节点路径上的和
     * @param path   记录从根节点到当前节点路径上的节点值。
     * @param ans    返回的结果集。
     */
    void dfs(TreeNode *node, int target, int sum, vector<int> &path,
             vector<vector<int>> &ans) {
        if (node == nullptr)
            return;
        path.push_back(node->val);// 记录该路径上的节点
        sum += node->val;// 累加从根节点到当前节点这条路径上所有节点的和。
        // 如果到达叶子节点,就不能往下走了,直接return
        if (node->left == nullptr && node->right == nullptr) {
            // 如果到达叶子节点,并且sum等于toal,说明我们找到了一组,
            // 要把它放到ans中
            if (target == sum)
                ans.push_back(path);
        } else {
            dfs(node->left, target, sum, path, ans);// 递归到左子节点
            dfs(node->right, target, sum, path, ans);// 递归到右子节点
        }
        path.pop_back();// 往回走撤销选择
    }

各大厂算法面试题已经整理好了,请看这里:《算法专栏》

#笔试#

为了应对春招和秋招找工作,我经过长时间的收集和整理了各大厂的算法面试题,所有的算法题我都已经做了实现,大家可以根据自己需要面试的大厂选择练习即可。适宜人群: 在校生、社招求职者及自学者。

全部评论

相关推荐

03-29 17:05
门头沟学院 Java
asdasdasda...:我前段时间找工作焦虑,有几天连续熬夜熬穿了,然后心脏突然不舒服,立马躺床上睡觉了,然后第二天还是不舒服,去看医生说是心率不齐,吓得我后面天天早早睡觉,调养身体,过了好几天才好过来。所以真的,工作这些东西哪有那么重要,最多钱多一点钱少一点,降低物欲。活着才是最重要的,现在想想真的后怕
如何排解工作中的焦虑
点赞 评论 收藏
分享
在笔试的大西瓜很矫健:校招数分不用想了,这经历和学历都不够用,大厂更别想,初筛都过不了,说点不好听的小厂数分都进不去(小厂也是假数分),要两个对口实习+3个项目(或者3+2),而且要有含金量才能补一点你的学历劣势。 建议刷实习,社招找数分,校招看运气,能入行业就行,可以运营转数分
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务