zoukankan      html  css  js  c++  java
  • 求和为某个值的路径.

    #include <iostream>
    
    #include <vector>
    
    #include <unordered_map>
    
    #include <string>
    
    using namespace std;
    
     
    
    struct TreeNode
    
    {
    
        int val;
    
        TreeNode *left;
    
        TreeNode *right;
    
        TreeNode(int x) { val = x; left = nullptr; right = nullptr; }
    
    };
    
     
    
    // 根据前序遍历顺序获取输入
    
    TreeNode* createTree()
    
    {
    
        TreeNode* root = NULL;
    
        string str;
    
        cin >> str;
    
        if (str != "null")
    
        {
    
            int num = atoi(str.c_str());
    
            root = new TreeNode(num);
    
            root->left = createTree();
    
            root->right = createTree();
    
            return root;
    
        }
    
        return NULL;
    
    }
    
     
    
    // 递归函数
    
    void recursion(vector<vector<int>> &res, vector<int> &path, TreeNode* root, int target, unordered_map<int, vector<int>> &prefixSum, int curSum)
    
    {
    
        if (!root) return;
    
     
    
        curSum += root->val;
    
        path.push_back(root->val);
    
        int prefixToFind = curSum - target;
    
     
    
        if (curSum == target) res.push_back(path);
    
     
    
        if (prefixSum.find(prefixToFind) != prefixSum.end())
    
        {
    
            for (int i = 0; i < prefixSum[prefixToFind].size(); i++)
    
            {
    
                int idx = prefixSum[prefixToFind][i] + 1;
    
                res.push_back(vector<int>(path.begin() + idx, path.end()));
    
            }
    
        }
    
     
    
        prefixSum[curSum].push_back(path.size() - 1);
    
        recursion(res, path, root->left, target, prefixSum, curSum);
    
        recursion(res, path, root->right, target, prefixSum, curSum);
    
        path.pop_back();
    
        prefixSum[curSum].pop_back();
    
    }
    
     
    
    // 寻找路径
    
    vector<vector<int>> findPath(TreeNode* root, int target)
    
    {
    
        vector<vector<int>> res;
    
        if (!root) return res;
    
     
    
        vector<int> path;
    
        unordered_map<int, vector<int>> prefixSum;
    
        int curSum = 0;
    
        recursion(res, path, root, target, prefixSum, curSum);
    
     
    
        return res;
    
    }
    
     
    
    int main()
    
    {
    
        TreeNode* root = createTree(); // 根据前序遍历顺序获取输入 [5 4 11 7 8 null null null 2 7 null null 10 null null null 8 13 null null 4 5 6 null null null 1 null null]
    
     
    
        vector<vector<int>> res = findPath(root, 22);
    
        for (int i = 0; i < res.size(); i++)
    
        {
    
            for (int j = 0; j < res[i].size(); j++)
    
            {
    
                cout << res[i][j] << " "; // 结果:[5, 4, 11, 7, 8]
    
            }
    
            cout << endl;
    
        }
     
    
        return 0;
    
    }

    Java:

    import java.util.*;
    
     
    
    public class Solution {
    
            
    
             public static void main(String[] args) {
    
    //               String[] nodes = {"5", "4", "8", "11", "null", "13",
    
    //                                  "4", "7", "2", "null", "null", "null", "null"
    
    //                                  , "5","1"};
    
    //               int k = 22;
    
                       String[] nodes = {"5", "4", "8", "11", "null", "13",
    
                                         "4", "7", "2", "null", "null", "null", "null"
    
                                         , "5","1", "8","null","7", "10",
    
                                         "null", "null", "null","null", "null", "null"
    
                                         ,"null", "null", "6","null", "null", "null"};
    
                       int k = 35;
    
                       TreeNode root = constructTree(nodes, 0, nodes.length);
    
                       List<List<TreeNode>> list = path(root, k);
    
                       for (int i = 0; i < list.size(); i++) {
    
                                for (int j = 0; j < list.get(i).size(); j++) {
    
                                         System.out.print(list.get(i).get(j).val + " ");
    
                                }
    
                                System.out.println();
    
                       }
    
             }
    
            
    
             public static TreeNode constructTree(String[] nodes, int i, int n) {
    
                       if(i >= n) return null;
    
                       String string = nodes[i];
    
                       if(string.equals("null")) return null;
    
                       TreeNode node = new TreeNode(Integer.valueOf(string));
    
                       node.left = constructTree(nodes, 2*i+1, n);
    
                       node.right = constructTree(nodes, 2*i+2, n);
    
                       return node;
    
             }
    
            
    
             public static List<List<TreeNode>> path(TreeNode root, int sum) {
    
                       List<List<TreeNode>> list = new ArrayList<>();
    
                       List<TreeNode> arr = new ArrayList<>();
    
                       if(root == null) return list;
    
                       Stack<TreeNode> sta = new Stack<>();
    
                       sta.add(root);
    
                       while(!sta.isEmpty()) {
    
                                root = sta.pop();
    
                                findPath(root, sum, list, arr);
    
                                if(root.right != null) sta.add(root.right);
    
                                if(root.left != null) sta.add(root.left);
    
                       }
    
                       return list;
    
             }
    
            
    
             public static void findPath(TreeNode root, int sum, List<List<TreeNode>> list, List<TreeNode> arr) {
    
                       sum -= root.val;
    
                       arr.add(root);
    
                       if(sum == 0) {
    
                                list.add(new ArrayList<>(arr));
    
                       }
    
                       if(root.left != null) findPath(root.left, sum, list, arr);
    
                       if(root.right != null) findPath(root.right, sum, list, arr);
    
                       arr.remove(arr.size()-1);
    
             }
    
    }
    
     
    
    class TreeNode{
    
             int val;
    
             TreeNode left;
    
             TreeNode right;
    
             TreeNode(){
    
                      
    
             }
    
             TreeNode(int val){
    
                       this.val = val;
    
             }
    
    }
  • 相关阅读:
    [COCI20142015#1] Kamp
    [CEOI2007]树的匹配Treasury
    [JLOI2016/SHOI2016]侦察守卫
    [POI2015]MOD
    [BJOI2017]机动训练
    [九省联考2018]一双木棋chess
    [清华集训2012]串珠子
    [POI2014]ZALFreight
    [SHOI2009]舞会
    [COCI2019]Mobitel
  • 原文地址:https://www.cnblogs.com/kelelipeng/p/13712970.html
Copyright © 2011-2022 走看看