剑指office 面试题34:二叉树中和为某一值的路径(C++回溯)

题目描述
输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。

例:(这个箭头咋弄??? 就当有吧。。。)

      10
   5       12
 4   7      

路径和为22

输出为:

   10   5     7
   10   12

思路

采用前序遍历+回溯算法

/*
struct TreeNode {
	int val;
	struct TreeNode *left;
	struct TreeNode *right;
	TreeNode(int x) :
			val(x), left(NULL), right(NULL) {
	}
};*/
class Solution {
public:
    void search(vector<int>&path,vector<vector<int> >&res,int total,TreeNode* root)
    {
    //深度搜索,直到为叶子节点
        if(root==NULL)
            return ;
            //每搜到一个节点,就保存在路径中
        path.push_back(root->val);
        //同时路径和减去节点值
        total-=root->val;
        
        //判断是不是叶子节点
        bool isLeave=(root->left==NULL)&&(root->right==NULL);

		//若是叶子节点,且total==0则保存路径
        if(total==0&&isLeave)
            res.push_back(path);

		//若不是叶子节点,继续向下搜寻
        if(root->left!=NULL)
            search(path,res,total,root->left);
        if(root->right!=NULL)
            search(path,res,total,root->right);

		//每次返回时要回溯,将路径的最后一个节点删除,同时路径和加上节点值
        path.pop_back();
        total+=root->val;
    }
    vector<vector<int> > FindPath(TreeNode* root,int expectNumber) {
        vector<int>path;
        vector<vector<int> >res;
        search(path,res,expectNumber,root);
        return res;
    }
};
展开阅读全文
©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客
应支付0元
点击重新获取
扫码支付

支付成功即可阅读