给定一个二叉树与整数sum,找出所有从根节点到叶结点的路径,这些路 径上的节点值累加和为sum
即创建一个二叉树,要求二叉树中有一个路径从根节点到叶节点到路径加起来代表到和为 给定的sum

如下二叉树

给定路径之和为18,则需要输出两条路径:
[1,4,5,8]
[1,4,6,7]

同样,这个过程我们可以使用先序深度优先搜索,同时需要使用临时数据结构保存搜索过程中出现的根节点,方便回溯。

实现过程如下:

void getpath(Tree *root, int &path_value, int num, std::vector<int> &path, std::vector<std::vector<int> > &result) {if (root == NULL) {return;}/*搜索的过程中计算和*/path_value += root->data;path.push_back(root->data);/*当访问到了叶子节点,且满足和为sum时,将最终的路径path加入到路径列表*/if (root -> left == NULL && root ->left == NULL && path_value == num) {result.push_back(path);}else if (path_value > num) { //剪枝,当当前路径之和已经大于sum,后面肯定也不存在了,所以后序当前节点的子节点遍历就没有必要了path_value -= root -> data;path.pop_back();}/*搜索左孩子*/getpath(root->left, path_value, num, path, result);/*搜索右孩子*/getpath(root->right, path_value, num, path, result);path_value -= root ->data;path.pop_back();
}
/*初始化并获取返回值*/
std::vector<std::vector<int>> pathSum(Tree *root, int num) {std::vector<std::vector<int>> result;std::vector<int> path;int path_value = 0;getpath(root,path_value, num, path ,result);return result;
}

测试代码如下:

#include <iostream>
#include <stack>
#include <vector>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>using namespace std;typedef struct tree
{int data;struct tree *left;struct tree *right;
}Tree,*TreeNode;/*创建二叉树*/
void createTree(TreeNode *root) {char val = 0;cin >> val;if (val == '*') {(*root) = NULL;} else {(*root) = (Tree *)malloc(sizeof(tree));if ((*root) == NULL) {cout << "create node failed " << endl;exit(-1);} else {(*root)->data = val - '0';createTree(&(*root)->left);createTree(&(*root)->right);}}
}
/*获取指定和为sum的路径*/
void getpath(Tree *root, int &path_value, int num, std::vector<int> &path, std::vector<std::vector<int> > &result) {if (root == NULL) {return;}path_value += root->data;path.push_back(root->data);if (root -> left == NULL && root ->left == NULL && path_value == num) {result.push_back(path);} else if (path_value > num) {path_value -= root -> data;path.pop_back();}getpath(root->left, path_value, num, path, result);getpath(root->right, path_value, num, path, result);path_value -= root ->data;path.pop_back();
}
/*初始化路径*/
std::vector<std::vector<int>> pathSum(Tree *root, int num) {std::vector<std::vector<int>> result;std::vector<int> path;int path_value = 0;getpath(root,path_value, num, path ,result);return result;
}int main(int argc, char const *argv[])
{/* code */TreeNode root;cout << "construct the tree " << endl;createTree(&root);cout << "input sum path  " << endl;int num;cin >> num;cout << "sum path is " << endl;std::vector<std::vector<int> > result;result = pathSum(root, num);for (int i = 0;i < result.size(); ++i) {for (int j = 0;j < result[i].size(); ++j) {cout << "[" << result[i][j] << "] ";}cout << endl;}return 0;
}

输出如下:

#输入:构造文章开头的二叉树
construct the tree
123***458***67***
input sum path
18#输出路径
sum path is
[1] [4] [5] [8]
[1] [4] [6] [7]

二叉树:路径之和 Path Sum相关推荐

  1. LeetCode 二叉树路径问题 Path SUM(①②③)总结

    (尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/77159954冷血之心的博客) 题目一:Path Sum 题目大意是 ...

  2. 常考数据结构与算法----给定一个二叉树和一个值 sum,请找出所有的根节点到叶子节点的节点值之和等于sum 的路径,

    题目描述 给定一个二叉树和一个值sum,请找出所有的根节点到叶子节点的节点值之和等于sum 的路径, 例如: 给出如下的二叉树,sum=22, 返回 [ [5,4,11,2], [5,8,9] ] 示 ...

  3. JAVA8 获取叶节点_Java找出所有的根节点到叶子节点的节点值之和等于sum 的路径...

    题目描述 给定一个二叉树和一个值 sum,请找出所有的根节点到叶子节点的节点值之和等于 sum 的路径, 例如: 给出如下的二叉树,sum=22, 返回 [ [5,4,11,2], [5,8,9] ] ...

  4. 112. Path Sum 路径总和

    Title 给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和. 说明: 叶子节点是指没有子节点的节点. 示例: 给定如下二叉树,以及目标和 su ...

  5. leetcode 112. Path Sum, 113. Path Sum II | 112,113. 路径总和 I, II(Java)

    题目 https://leetcode.com/problems/path-sum/ https://leetcode.com/problems/path-sum-ii/ 题解 简单的遍历二叉树,不解 ...

  6. [Leetcode] Path Sum II路径和

    Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals the given su ...

  7. 二叉树-路径总和(递归)

    题意: 给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和. 说明: 叶子节点是指没有子节点的节点. 示例: 给定如下二叉树,以及目标和 sum ...

  8. [LeetCode]113.Path Sum II

    [题目] Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals the giv ...

  9. [Leetcode] Binary Tree Maximum Path Sum

    这是LeetCode上的一道题目,需要求二叉树中两点路径的最大和.原题是 https://oj.leetcode.com/problems/binary-tree-maximum-path-sum/ ...

最新文章

  1. P2955 [USACO09OCT]奇数偶数Even? Odd?
  2. linux删除文件退出,在Linux中用于在移动或删除文件时使`tail -f`退出的bash脚本
  3. py-faster-rcnn + ZF 实现自己的数据训练与检测(二)
  4. 华为网络设备上的常用安全技术(一)
  5. NodeJS-queryString
  6. 关于Makefile,Makefile.in,Makefile.am,Configure功能及相互关系的问题
  7. Java常用设计模式——观察者模式
  8. anaconda 安装simpleitk
  9. AndroidStudio_从Eclipse到AndroidStudio开发工具_认识使用AndroidStudio_导入用eclipse开发的工程---Android原生开发工作笔记69
  10. linux信任本地jar包,jar包在linux本地运行成功, 但是jenkins构建失败
  11. ubuntu解决tensorflow提示未编译使用SSE3、SSE4.1、SSE4.2、AVX、AVX2、FMA的问题
  12. linux中间人攻击工具,[web安全]使用ARPspoof进行中间人(MiTM)攻击
  13. 人类简史-读书笔记之历史演变图
  14. 12月年末总结与新年期望
  15. jQuery--样式操作(addClass()、removeClass()、toggleClass()、css())详解
  16. 学习笔记之Vue基础学习(一)
  17. 【历史上的今天】9 月 27 日:“3Q 大战”正式打响;第一个被通缉的电脑黑客;知名“美女病毒”作者被定罪
  18. Arduino - PC817C光耦
  19. json数组删除重复项
  20. 如何把视频mp4转换mp3音乐

热门文章

  1. 传智168期JavaEE struts2杜宏 day 29~day31笔记(2017年2月4日23:14:00)
  2. React Native之ViewPagerAndroid跳转页面问题
  3. 29个简单直观的移动设备网页设计
  4. usaco Hamming Codes
  5. android手机装windows,安卓手机上运行WindowsXP系统图文教程
  6. 弹性网络_理论物理所建立解析模型研究凝胶网络弹性介导的液液相分离现象
  7. cxgrid中纵横单元格合并_被合并单元格折磨疯的我,真后悔没早点知道这个Excel技巧!...
  8. 用C语言编写万年历6,C语言编写万年历
  9. 使用Python,OpenCV转换颜色空间,追踪对象的轨迹
  10. LabVIEW保存、读取配置文件