我觉得这个题目和剑指offer中的一道题目非常相似。先说这个题:

解题思路:从根结点开始,当每访问到一个结点,我们把该结点添加到路径上,并"累加"

该结点的值,这里"累加"的含义指的是按照题目的要求组成相应的数字即"左移"后相加。

如果该结点为叶结点,那么一条路径搜索完成,将当前所得结果累加。如果当前不是叶子

结点,则继续访问它 的子结点。当前结点访问结束后,递归函数将自动回到它的父结点。

因此我们在函数退出之前要在路径上"删除"当前结点,做法就是将当前路径值/10,以确

保返回父结点时路径刚好是从根结点到父结点的路径。我们不难看出保存路径的数据结构

实际上是一个栈,因为路径要与递归调用状态一致,而递归调用的本质就是一个压栈和出

栈的过程。

class Solution {

public:

void sumNumbersCore(TreeNode *root, int &pathNum, int &sum) {

if(root){

pathNum = pathNum * 10 + root->val;

//如果是叶子节点,一条路径搜索完成,累加到sum

if(!root->left && !root->right){

sum += pathNum;

}

//如果不是叶子节点,则遍历它的子结点

else{

if(root->left)

sumNumbersCore(root->left, pathNum, sum);

if(root->right)

sumNumbersCore(root->right, pathNum, sum);

}

//返回父结点之前,路径上“删除”当前节点

pathNum /= 10;

}

}

int sumNumbers(TreeNode *root) {

int pathNum = 0;

int sum = 0;

sumNumbersCore(root, pathNum, sum);

return sum;

}

};

剑指offer面试题25:输入一棵二叉树和一个整数,打印出二叉树中结点值的和为输入

整数的所有路径。从树的根结点开始往下一直到叶节点所经过的结点形成一条路径。

解题思路:从根结点开始,当每访问到一个结点,我们把该结点添加到路径上,并累加

该结点的值。如果该结点为叶结点并且路径中结点值的和刚好等于输入的整数,则当前

路径符合要求,我们把它打印出来。如果当前不是叶子结点,则继续访问它的子结点。

当前结点访问结束后,递归函数将自动回到它的父结点。因此我们在函数退出之前要在

路径上删除当前结点并减去当前结点的值,以确保返回父结点时路径刚好是从根结点到

父结点的路径。我们不难看出保存路径的数据结构实际上是一个栈,因为路径要与递归

调用状态一致,而递归调用的本质就是一个压栈和出栈的过程。

class Solution {

public:

void hasPathSumCore(TreeNode *root, int &currentSum, int target, bool &flag){

if(root){

currentSum += root->val;

//如果当前结点是叶子节点并且路径上结点的和等于target

if(!root->left && !root->right){

if(currentSum == target)

flag = true;

}

//如果不是叶子结点,则遍历它的子结点

else{

if(root->left)

hasPathSumCore(root->left, currentSum, target, flag);

if(root->right)

hasPathSumCore(root->right, currentSum, target, flag);

}

//返回父结点之前,在路径上删除当前结点

currentSum -= root->val;

}

}

bool hasPathSum(TreeNode *root, int sum) {

int currentSum = 0;

bool flag = false;

hasPathSumCore(root, currentSum, sum, flag);

return flag;

}

};

如果我们要求的再严格一些,输出二叉树中和为某一值的路径,其实可以用同一种思路

去解,可以沿用上面的代码,只需略作修改:

class Solution {

public:

void hasPathSumCore(TreeNode *root, int &currentSum, int target, vector &tempPath, vector> &paths){

if(root){

tempPath.push_back(root->val);

currentSum += root->val;

//如果是叶子结点,并且路径和等于target,保存当前路径

if(!root->left && !root->right){

if(currentSum == target)

paths.push_back(tempPath);

}

//如果不是叶子结点,遍历其子结点

else{

if(root->left)

hasPathSumCore(root->left,currentSum,target,tempPath,paths);

if(root->right)

hasPathSumCore(root->right,currentSum,target,tempPath,paths);

}

//返回到父结点之前,在路径上pop_back()当前节点,

//相应的在路径和中减去当前节点的val。

currentSum -= root->val;

tempPath.pop_back();

}

}

vector > pathSum(TreeNode *root, int sum) {

int currentSum = 0;

vector> paths;

vector tempPath;

hasPathSumCore(root, currentSum, sum, tempPath, paths);

return paths;

}

};

java根节点到叶子节点_二叉树根节点到叶子节点的所有路径和相关推荐

  1. 完全二叉树最小深度_二叉树:我有多少个节点?

    给「代码随想录」一个星标吧! ❝ 不管有多少个节点,大家中秋&&国庆快乐哈 ❞ 如果之前两篇二叉树:看看这些树的最大深度, 二叉树:看看这些树的最小深度都认真看了的话,这道题目可以分分 ...

  2. 韦东山uboot_内核_根文件系统学习笔记4.4-第004课_根文件系统-第004节_构建根文件系统之构建根文件系统

    一 最小的根文件系统需要的项(笔记4.1 4.2小结) (init 进程需要) 打开终端: /dev/console, /dev/NULL 不设置 inittab 格式中的 id(标准输入.输出和标准 ...

  3. 打印二叉搜索树的叶子结点_求孩子兄弟树叶子节点数目

    记得点击蓝字关注叉酱哦!题目:求孩子-兄弟树叶子节点数目TREE什么是孩子-兄弟树? 孩子兄弟表示法模型,每个结点都有一个指向其第一个孩子的指针,每个结点都有一个指向其第一个右兄弟的指针 . 算法思想 ...

  4. java计算二叉树的节点最小值_求二叉树根节点到叶子节点路径和的最小值:遍历(递归+非递归)...

    昨晚中兴笔试题,第一题是给定二叉树,每个节点的数据结构是 value,left,right,比较根节点到各个叶子节点路径和的大小,输出路径和的最小值.(补充:用ArrayList可以存储) 以前没做过 ...

  5. Java实现判断叶子节点_寻找二叉树最远的叶子结点(实例讲解)

    二叉树最远的叶子实例分享 面试的时候碰到一个题:如何找到一个二叉树最远的叶子结点,以及这个叶子结点到根节点的距离? 第一反应肯定是递归 如何能找到最远的叶子结点,同时也能记下这个叶子节点到根节点的距离 ...

  6. c#二叉树 取叶子节点个数_二叉树的最小深度+完全二叉树的节点个数

    二叉树的最小深度 题目:给定一个二叉树,找出其最小深度. 最小深度是从根节点到最近叶子节点的最短路径上的节点数量. 说明:叶子节点是指没有子节点的节点. 示例 1: 输入:root = [3,9,20 ...

  7. 求二叉树指定结点到根的路径c语言,二叉树根节点到叶子结点和为指定值的路径...

    题目描述 image.png 题解 解题思路与二叉树根节点到叶节点的所有路径和一题相似,都是采用递归算法.但这个题加了一点,要求保存路径到vector中. 为了保存路径,这里给递归函数传递一个vect ...

  8. 求二叉树上结点的路径c语言版,求二叉树根到给定节点的路径设计报告.doc

    求二叉树根到给定节点的路径设计报告 题目: 求二叉树根到给定节点的路径 摘要:本程序设计题要求出二叉树的根节点到给定节点的路径,我们利用二叉树的双亲存储表示法建立二叉树,然后在树的叶子节点中找到给定的 ...

  9. java 树最大距离_寻找二叉树最远的叶子结点(实例讲解)

    面试的时候碰到一个题:如何找到一个二叉树最远的叶子结点,以及这个叶子结点到根节点的距离? 第一反应肯定是递归 如何能找到最远的叶子结点,同时也能记下这个叶子节点到根节点的距离呢?采用一个List保持从 ...

最新文章

  1. win10+Linux双系统安装及一些配置问题
  2. 面试题:冒泡排序的优化
  3. linux shell (4) - Loop 循环
  4. fgets函数及其用法,C语言fgets函数详解
  5. 自动装箱和==和equals
  6. Apache RocketMQ 分享
  7. 7-模块开发卷宗(GB8567——88)
  8. (大家发表一下看法)微软研发智能系统 可通过电脑24小时监控员工
  9. javaweb JAVA JSP球鞋销售系统购物系统ssm购物系统购物商城系统源码(ssm电子商务系统)
  10. [Mac]使用系统自带的词典程序快速取词翻译
  11. Zeppelin的求学之路(1)—— 简介 和 从源码Build的安装并配置他的Spark解析器
  12. 使用C++实现n阶行列式的计算
  13. 实例详解ISA防火墙策略元素:ISA2006系列之五
  14. 如何进行接口测试(一篇学会)
  15. java sql查询空内容_返回null值而不是sql查询中的空集
  16. 机器视觉、模式识别开源库汇总
  17. 无线图传- HDMI1.4 无线图传
  18. 全景视频拼接(二)--OpenCV源码解析
  19. 游戏回归娱乐本质 中型休闲游戏可能崛起
  20. SpringBoot实现多文件压缩下载.zip

热门文章

  1. 开源免费的脑电/脑磁图数据分析软件汇总
  2. 通过view实现实时监测数据的实时更新展示
  3. 虚拟内存(操作系统)
  4. 小陈学JS 函数练习:用户输入一个数判断是否是素数,并返弹出回值(又叫质数,只能被1和自身整数的数)
  5. 肖特基二极管与整流二极管谁能更胜一筹?
  6. js 动态生成 input 的绑定事件 blur 无效
  7. Android安装apk应用的时候出现INSTALL_FAILED_SHARED_USER_INCOMPATIBLE如何解决
  8. ESP Wi-Fi 连接异常断开原因排查分析
  9. 静态成员与静态成员函数
  10. Spring项目接口偶尔报404 Not Found