剑指offer之面试题24:二叉树中和为某一值的路径

发布时间:2020-06-19 18:47:06 作者:momo462
来源:网络 阅读:620

题目:

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

例如输入下图中二叉树和整数22,则打印出两条路径,第一条路径包含结点10、12,第二条路径包含结点10、5和7。

剑指offer之面试题24:二叉树中和为某一值的路径

思路:

1、判断根结点是否为空

2、单一路径要有vector<int> path保存;

3、多条路径要有vector<vector<int>> ret保存并返回;

4、从根结点分析,由于每次遍历都要先把结点的值进行访问所以是前序遍历;

5、在遍历的同时,需要保存访问过结点的值,并且和expectNumber相减得到剩余expectNumber

6、只有根结点才用判断最后的值和剩余expectnumber相等,不相等,pop出path

7、根结点相等即为递归退出条件

代码:

/*
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> > FindPath(TreeNode* root,int expectNumber) 
    {
		vector<vector<int>> ret;
        vector<int> path;
        if(root==NULL)
        {
            return ret;
        }
        findLeaf(ret,path,root,expectNumber);
        return ret;
    }
    void findLeaf(vector<vector<int>> &ret,vector<int> &path,TreeNode *node,int left)
    {
        path.push_back(node->val);
        //终止条件
        if(left-node->val==0&&node->left==NULL&&node->right==NULL)
        {
            ret.push_back(path);
        }
        else
        {
            if(node->left)
            {
                int l=left-node->val;
                findLeaf(ret,path,node->left,l);
            }
            if(node->right)
            {
                int l=left-node->val;
                findLeaf(ret,path,node->right,l);
            }
        }
        //是叶子节点但是路径和不一样,pop这个叶子节点
        path.pop_back();
    }
};

精简版代码:

/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};*/
class Solution {
    vector<vector<int> >allRes;
    vector<int> tmp;
    void dfsFind(TreeNode * node , int left){
        tmp.push_back(node->val);
        if(left-node->val == 0 && !node->left && !node->right)
            allRes.push_back(tmp);
        else {
            if(node->left) dfsFind(node->left, left-node->val);
            if(node->right) dfsFind(node->right, left-node->val);
        }
        tmp.pop_back(); 
    }
public:
    vector<vector<int> > FindPath(TreeNode* root,int expectNumber) {
        if(root) dfsFind(root, expectNumber);
        return allRes;
    }
};


推荐阅读:
  1. 剑指offer:二叉树中和为某一值的路径
  2. 剑指offer之面试题23:从上往下打印二叉树

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

二叉树 offer 剑指

上一篇:备份与灾备系统方案

下一篇:一招实现“微信直接下载APK”+“社交平台一键拉起”

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》