【二叉树】二叉树中为某一值的路径

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m0_38033475/article/details/91345248

大致思路:

二叉树嘛,就递归。这道题我用dfs来解决,找好临界条件,剪枝,注意vector存储的是数值不是结点。

有一个问题就是,我这样dfs得到的结果vector数组中,并不是按vector长度从大到小来排列的,因为dfs有可能左子树的更短但是先去看的左子树的路径。因此,需要对vector数组进行排序,并且记录数组下标,从而建立新的vector数组。

我想到的方法就是map<int,int>表示“该vector的下标-该vector的长度”,再对“长度”进行排序,排序后的key就是调整好顺序的下标。但是这个实现需要通过vector,方法如下。

map的排序:先写好cmp函数,再采用vector<pair<int,int> >来存储map的内容,对vector进行排序。(详见https://blog.csdn.net/m0_38033475/article/details/79309694

AC代码:

/*
struct TreeNode {
	int val;
	struct TreeNode *left;
	struct TreeNode *right;
	TreeNode(int x) :
			val(x), left(NULL), right(NULL) {
	}
};*/
class Solution {
public:
    vector<vector<int> > result;
    
    void find(TreeNode* h,int expectNumber,int sum,vector<int> now) //dfs
    {
        now.push_back(h->val);
        sum += h->val;
        if(sum==expectNumber)
        {
            if(h->left==NULL && h->right==NULL) //必须要到达叶子结点
            {
                result.push_back(now);
                return;
            }
            else
                return;
        }
        if(sum>expectNumber) 
            return;
        //如果已经到了叶子结点但没达到目标值,则也退出
        if(h->left==NULL && h->right==NULL)
            return;
        if(h->left!=NULL)
            find(h->left,expectNumber,sum,now);
        if(h->right!=NULL)
            find(h->right,expectNumber,sum,now);
    }
    
    map<int, int>m; //下标-数组长度
    
    static bool cmp(pair<int,int> a, pair<int,int> b)
    {
        if(a.second>b.second)
            return true;
        else 
            return false;
    }
    
    
    vector<vector<int> > FindPath(TreeNode* root,int expectNumber) 
    {
        //先判=空或只有一个
        if(root==NULL)
            return result;
        if(root->left==NULL && root->right==NULL)
        {
            if(root->val==expectNumber)
            {
                vector<int> ans;
                ans.push_back(root->val);
                result.push_back(ans);
                return result;
            }
            else
                return result;
        }
        vector<int> ans;
        find(root,expectNumber,0,ans);
        
        //题目要求,在vector中数组长度大的靠前
        //先统计每个数组的长度
        for(int i=0;i<result.size();i++)
        {
            m[i]=result[i].size();
        }
        vector<pair<int,int> >v(m.begin(),m.end());
        sort(v.begin(),v.end(),cmp);
        vector<vector<int> > real_result;
        for(int i=0;i<result.size();i++)
        {
            real_result.push_back(result[v[i].first]);
        }
        return real_result;
    }
};

猜你喜欢

转载自blog.csdn.net/m0_38033475/article/details/91345248