zoukankan      html  css  js  c++  java
  • 12 二叉树中和为某一值的路径

    0 引言

    题目:输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点
    开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)

    1 抽象问题具体化

    举例1:树的形态如图所示。给定的整数值为22,求路径。

    解答:所有的路径总共有三条,分别是

    1)10->5->4,和为19;

    2)10->5->7,和为22,打印出路径信息;

    3)10->12,和为22,打印出路径信息.

    2 具体问题抽象分析

    1)currentSum 求解,每次访问即运行 currentSum += root->val;

    2)thisPath.push_back(root->val);

    3)对当前结点进行判断,如果当前结点为叶节点且满足 currentSum == expectedNum, 则myPaths.push_back(thisPath);

    4)访问当前结点的左结点,访问当前结点的右结点;

    5)访问完毕退回,thisPath.pop_back();

    6) 根据路径长短对所有路径进行排序,返回结果.

    3 demo 

        void visitPath(vector<vector<int>> &myPaths, vector<int> &thisPath, TreeNode* root, int expectNumber, int currentSum){
            currentSum += root->val;
            thisPath.push_back(root->val);
            if(currentSum == expectNumber && root->left == NULL && root->right == NULL)
                myPaths.push_back(thisPath);
            if(root ->left != NULL)
                visitPath(myPaths, thisPath, root->left, expectNumber, currentSum);
            if(root ->right != NULL)
                visitPath(myPaths, thisPath, root->right, expectNumber, currentSum);
            // 访问完退回去
            thisPath.pop_back();
            currentSum -= root->val;
        }
        vector<vector<int> > FindPath(TreeNode* root,int expectNumber) {
            vector<vector<int>> myPaths;
            if(root == NULL)
                return myPaths;
            vector<int> thisPath;
            int currentSum = 0;
            visitPath(myPaths, thisPath, root, expectNumber, currentSum);
            // 排序
            for(int i=1;i<myPaths.size();i++){
                for(int j=i;j>0;j--){
                    if(myPaths[j].size() > myPaths[j-1].size())
                        myPaths[j].swap(myPaths[j-1]);
                }
            }
            return myPaths;        
        }

    4 代码优化

  • 相关阅读:
    HDU3247 Resource Archiver(AC自动机+BFS+DP)
    POJ2486 Apple Tree(树形DP)
    POJ1699 Best Sequence(AC自动机+状压DP)
    SPOJ287 Smart Network Administrator(最大流)
    POJ3189 Steady Cow Assignment(最大流)
    ZOJ2332 Gems(最大流)
    COGS731 [网络流24题] 最长递增子序列(最大流)
    POJ1947 Rebuilding Roads(树形DP)
    POJ1135 Domino Effect(SPFA)
    SPOJ962 Intergalactic Map(最大流)
  • 原文地址:https://www.cnblogs.com/ghjnwk/p/10049982.html
Copyright © 2011-2022 走看看