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

一. Leetcode-113 Path Sum II

输入一颗二叉树的根节点和一个整数,按字典序打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
用深度遍历方式寻找该路径。
需要用三个成员变量记录中间结果:
vector<vector> paths;//即最终返回结果
vector path;//当前遍历的路径
int sum = 0;//当前路径的和

注意的是,深度遍历完成后,要把list中的最后一个数删除。深度遍历,遍历到叶子节点后(即得到一个答案后),要返回到该叶子节点的父节点,所以要把该list中的最后一个数删除。如二叉树(1,2,1,#,#,1,#),输入的参数是3,遍历到2时,得到一个list={1,2},然后要返回节点1,即pop_back 2 ,然后继续遍历得到另一个答案list={1,1,1}。

代码如下:

class Solution {
private:
  vector<vector<int>> paths;
  vector<int> path;//当前遍历的路径
  int sum = 0;//当前路径的和
public:
    vector<vector<int> > FindPath(TreeNode* root,int expectNumber) {
      Dfs(root, expectNumber);
      return paths;
    }
    
    void Dfs(TreeNode* root, int target) {
      if (root == nullptr) {
        return;
      }
      path.push_back(root->val);
      sum += root->val;
      if (sum == target && root->left == nullptr && root->right == nullptr) {
        //遍历到叶子节点,且和为目标值
        paths.push_back(path);
      }
      Dfs(root->left, target);
      Dfs(root->right, target);
      // 一条路径找到后,当前path的最后一个元素要pop,深度遍历继续寻找其他路径
      sum -= path.back();
      path.pop_back();
    }
};

二. Leetcode-129:Sum Root to Leaf Numbers

首先看下一道比较简单的题目,输入一个二叉树,输出所有路径代表的十进制数之和。

一般二叉树类的题目,肯定要用到递归函数。
本题中

递归函数的参数有三个:root,total_sum(引用传递,即最终结果), sum(单条路径的和)

递归函数的跳出条件为遍历到叶子节点,返回前要把sum加到total_sum上。

int sumNumbers(TreeNode* root) {
    int total_sum = 0;
    sumNumbersHelper(root, total_sum, 0);
    return total_sum;
}

void sumNumbersHelper(TreeNode* root, int &total_sum, int sum)
{
    if(root ==  NULL)
    {
        return;
    }
    
    sum = sum*10 + root->val;
    
    if(root->left == NULL && root->right == NULL)
    {
        total_sum += sum;
        return;
    }
    
    if(root->left != NULL)
    {
        sumNumbersHelper(root->left, total_sum, sum);
    }
    
    if(root->right != NULL)
    {
        sumNumbersHelper(root->right, total_sum, sum);
    }   
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值