剑指offer:打印二叉树中和为K的所有路径: 二叉树中和为某一值的路径

39 篇文章 1 订阅

题目:

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

题目解析已经写到代码中啦!

/*
struct TreeNode {
	int val;
	struct TreeNode *left;
	struct TreeNode *right;
	TreeNode(int x) :
			val(x), left(NULL), right(NULL) {
	}
};*/
// 要求返回所有路径,路径是指从根节点到叶子节点。
// 从根节点开始遍历,如果根节点为空则返回空,
// 若加上当前节点的值已经等于期望节点并且该节点为叶子节点,则需要将该路径加入总路径统计中
// 否则,遍历左子树,左子树遍历完紧接着遍历右子树。可以从根节点开始遍历,,
// 当改节点的左右子树都已经遍历完说明含有该节点的所有可能路径都已经遍历完
class Solution {
public:
    // 加上当前节点的值,判断当前和是否等于期望值。如果相等且当前节点为叶子节点则将路径加入到总路径统计中
    // 如果不是叶子节点则遍历左右子树,左右子树都遍历完则说明以该节点为路径节点的都已经遍历完,返回到上一个节点。
    void FindPath(TreeNode* root,
                  vector<vector<int>> &paths,
                  vector<int>&path,
                  int currentSum,
                  int expectNumber) {
       currentSum +=root->val; //加上当前值
       path.push_back(root->val); //将当前节点压入路径
       bool isLeaf = (root->left== nullptr && root->right == nullptr);
       if(currentSum == expectNumber && isLeaf){ //是叶子节点并且和期望值相等,则加入到总路径
           paths.push_back(path);
       }
       if(root->left !=nullptr)
           FindPath(root->left, paths,path, currentSum, expectNumber);
       if(root->right!=nullptr)
           FindPath(root->right, paths, path, currentSum, expectNumber);
        path.pop_back();
    }
    vector<vector<int> > FindPath(TreeNode* root,int expectNumber) {
          vector<vector<int>> paths;
          if(root == nullptr) return paths; //为空直接返回paths
          vector<int>path; //定义一个路径,currentSum - 0;
          FindPath(root, paths,path, 0, expectNumber);
          return paths;
    }
};

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值