问题描述:

输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。

例如输入整数30和如下二元树
 
14
/ \
5 16
/ \
3 11
则打印出两条路径:14, 16 和14, 5, 11。

二元树节点的数据结构定义为:

typedef struct BSTree {
int data;
BSTree* left;
BSTree* right;
} tree_node;

在遍历树的过程中,使用stack保存所走过的路径。如果当前节点为叶子节点,并且路径和等于输入的整数,则输出路径。如果当前节点不是叶子节点,则递归的访问它的孩子节点。在回溯的过程中,注意路径的出栈。

代码实现:

 // 4.cc
#include <iostream>
#include <vector>
using namespace std; // 二叉查找树
typedef struct BSTree {
int data;
BSTree* left;
BSTree* right;
} tree_node; // 创建二元查找树
void add_BSTree_node(tree_node* &p_current, int data) {
if (NULL == p_current) {
tree_node *node = new tree_node();
node->left = NULL;
node->right = NULL;
node->data = data;
p_current = node;
} else {
if (p_current->data > data)
add_BSTree_node(p_current->left, data);
else if (p_current->data < data)
add_BSTree_node(p_current->right, data);
else
cout << "The data has already in the tree.";
}
} void find_path(tree_node* root, int target, vector<int>& path, int& current_sum) {
if(!root)
return; current_sum += root->data;
path.push_back(root->data); // 是叶子节点,并且等于target
bool is_leaf = (!root->left && !root->right);
if(current_sum == target && is_leaf) {
for(vector<int>::iterator it = path.begin(); it != path.end(); ++it)
cout << *it << " ";
cout << endl;
} // 非叶子节点,遍历孩子
if(root->left)
find_path(root->left, target, path, current_sum);
if(root->right)
find_path(root->right, target, path, current_sum); // pop当前元素
current_sum -= root->data;
path.pop_back();
} int main() {
tree_node *root = NULL; add_BSTree_node(root, );
add_BSTree_node(root, );
add_BSTree_node(root, );
add_BSTree_node(root, );
add_BSTree_node(root, ); vector<int> path;
int target = ;
int current_sum = ;
find_path(root, target, path, current_sum); return ;
}

转载自源代码

本文链接地址: http://w.worthsee.com/index.php/4-%e5%9c%a8%e4%ba%8c%e5%85%83%e6%a0%91%e4%b8%ad%e6%89%be%e5%87%ba%e5%92%8c%

IT公司100题-4-在二元树中找出和为某一值的所有路径的更多相关文章

  1. (转)在二元树中找出和为某一值的所有路径,java版本

    摘自:http://www.cnblogs.com/qi09/archive/2011/05/24/2055643.html 4.在二元树中找出和为某一值的所有路径 题目:输入一个整数和一棵二元树.  ...

  2. 4.在二元树中找出和为某一值的所有路径[FindPathsInBinaryTree]

    [题目]: 输入一个整数和一棵二元树.从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径.打印出和与输入整数相等的所有路径. 例如输入整数22和如下二元树 10              ...

  3. IT公司100题-16-层遍历二元树

    问题描述: 层遍历二叉树,同一层从左往右打印. 定义二元查找树的结点为: typedef struct BSTreeNode { int data; BSTreeNode *left; BSTreeN ...

  4. Linux运维之批量下载指定网站的100个图片文件,并找出大于200KB的文件

    题目为:  有一百个图片文件,它们的地址都是http://down.fengge.com/img/1.pnghttp://down.fengge.com/img/2.png…一直到http://dow ...

  5. IT公司100题-15-求二元查找树的镜像

    问题描述: 输入一颗二元查找树,将该树转换为它的镜像树,即对每一个节点,互换左右子树.   例如输入:   6/    \4     12/ \   /   \2  5 8   16 输出:   6/ ...

  6. IT公司100题-9-判断整数序列是不是二元查找树的后序遍历结果

    问题描述: 输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果. 如果是返回true,否则返回false. 例如输入4, 8, 6, 12, 16, 14, 10,由于这一整数序列是如下树 ...

  7. IT公司100题-11-求二叉树中节点的最大距离

    问题描述: 写程序,求一棵二叉树中相距最远的两个节点之间的距离. 10/     \6      14/   \   /   \4    8 12    16 分析: 二叉树中最远的两个节点,要么是根 ...

  8. IT公司100题-1-二叉树转换为双链表

    问题描述: 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表.要求不能创建任何新的结点,只调整指针的指向. 10   /   \  6      14/  \    /   \4   8 1 ...

  9. IT公司100题-35- 求一个矩阵中最大的二维矩阵(元素和最大)

    问题描述: 求一个矩阵中最大的二维矩阵(元素和最大).如: 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 中最大的是: 4 5 9 10   分析: 2*2子数组的最大和.遍历求和,时 ...

随机推荐

  1. Sqlserver_In、exists使用

    in是把外表和内表作hash 连接,而exists 是对外表作loop 循环,每次loop 循环再对内表进行查询. 一直以来认为exists 比in 效率高的说法是不准确的.如果查询的两个表大小相当, ...

  2. 基于gralde搭建spring boot项目

    搭建基于gradle的sprint boot项目,swagger-ui辅助 spring boot官网:http://projects.spring.io/spring-boot/get start ...

  3. 如何精确地测量java对象的大小-底层instrument API

    转载: 如何精确地测量java对象的大小-底层instrument API 关于java对象的大小测量,网上有很多例子,大多数是申请一个对象后开始做GC,后对比前后的大小,不过这样,虽然说这样测量对象 ...

  4. python3.x随手笔记1

    语法分析 Python程序读取的 解析器 . 解析器的输入流 令牌 ,生成的 词法分析程序 . 这一章描述了如何 词法分析程序把一个文件分解成令牌. Python读取程序文本作为Unicode代码点; ...

  5. VBA对象模型(1)

    关于对象和集合的比喻 Excel的基本单元是Workbook对象:在快餐连锁店中,基本的单元是单个餐馆.使用Excel可以添加工作簿和关闭工作簿,所有打开的工作簿组成了Workbooks集合(Work ...

  6. ubuntu下安装基本配置

    安装ubuntu更新: sudo apt-get update sudo apt-get upgrade 安装Docky: sudo add-apt-repository ppa:ricotz/doc ...

  7. (20)odoo中的action

    ---------更新时间18:06 2016-09-18 星期日15:05 2016-03-14 星期一18:07 2016-02-19 星期五---------* 窗口动作   <?xml ...

  8. hdu----(3065)病毒侵袭持续中(AC自动机)

    病毒侵袭持续中 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

  9. sql 语句 截取字符串的两种方案

    方案一:使用内置的函数 SUBSTRING,CHARINDEX,LEN三个内置函数 理论: SUBSTRING语法   SUBSTRING ( value_expression , start_exp ...

  10. WordPress怎么在页面上添加目录

    要实现的如下功能,在页面上添加一个文章目录: 步骤:   1)在wordpress中,在Posts----Categories中建立目录, 2) 3)add new post,指定post所属的cat ...