面试题25:二叉树中和为某一值的路径

面试题25:二叉树中和为某一值的路径

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

思路:路径的模拟类似堆栈,这里采用数组vector存储,push_back,pop_back模拟堆栈,为了方便读取除了栈顶以外的其他元素。

由于先访问根,所以采用先序遍历。如果遍历到叶节点,当前值与期望值两个值不同,则每次要在返回父节点的过程中回删除数组中的节点。

如果当前的和与期望值相同且为叶子结点,则将当前数组存储到二维数组中

这里的难点一是在于堆栈采用的模拟,二是在两次递归后面删除堆栈尾节点,三是采用了二维数组和一位数组的方式进行存储,只有确定相同的值才存放到二维数组中。

/*
struct TreeNode {
	int val;
	struct TreeNode *left;
	struct TreeNode *right;
	TreeNode(int x) :
			val(x), left(NULL), right(NULL) {
	}
};*/
class Solution {
public:
    int count=0;
public:
    void Find(TreeNode* root ,int expectNumber,vector<vector<int>>&path,vector<int>&tmppath,int currentSum)
    {
        currentSum+=root->val;
        tmppath.push_back(root->val);
        bool isLeaf=root->left==NULL&&root->right==NULL;
        if(currentSum==expectNumber && isLeaf)
        {
            path.push_back(tmppath);
        }
        if(root->left!=NULL)
            Find(root->left,expectNumber,path,tmppath,currentSum);
        if(root->right!=NULL)
            Find(root->right,expectNumber,path,tmppath,currentSum);
        tmppath.pop_back();
    }
public:
    vector<vector<int> > FindPath(TreeNode* root,int expectNumber) {
        vector<vector<int>>path;
        vector<int>tmppath;
        if(root==NULL)
            return path;
        int currentSum=0;
        
        Find(root,expectNumber,path,tmppath,currentSum);
        return path;
    }
};

猜你喜欢

转载自blog.csdn.net/MereX/article/details/89704962