题目描述:

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

与输入整数相等的所有路径。

二叉树中的路径

从二叉树的根节点出发,至二叉树的叶子节点的一条直线,称为二叉树的一条路径

例如:输入整数22和如下二元树

10
/  \

5 12
/  \

4  7

则打印出两条路径:10, 12和10, 5, 7。

思路:

从二叉树的根节点出发,并将该节点入栈,更新currentSum的值,再遍历该节点的左子树,直到叶子节点后,判断currentSum的值,判断与输入值比较后,返回该叶子节点的父亲节点,并弹出栈顶元素,继续遍历父亲节点的右子树,直到叶节点。重复以上步骤,知道所有节点遍历完后。

代码实现

#include <iostream>

#include <vector>
#include "tree.h"
#include <cstring>
using namespace std; void Find(vector<int>&, BTNode*, int, int);
////////////////////////////////////////////
// 寻找路径
////////////////////////////////////////////
void FindPath(BTNode *root, int pathSum)
{
vector<int> path;
int currentSum=0;
memset(&path, 0, sizeof(path));
Find(path, root, pathSum, currentSum);
} void Find(vector<int> &path, BTNode *root, int pathSum, int currentSum)
{
currentSum += root->data; //记录当前路径的和
path.push_back(root->data); //将当前节点值压栈
//判断当前节点是不是叶子节点
bool isLeaf = root->left==NULL && root->right==NULL;
//该节点是叶子节点,且路径的和符合要求,则打印路径
if(currentSum == pathSum && isLeaf)
{
cout << "A path is found: "<< endl;
vector<int>::iterator it = path.begin();
for(; it!=path.end(); it++)
cout << *it << " ";
cout << endl;
}
//遍历该节点的左子树
if(root->left!=NULL)
Find(path, root->left, pathSum, currentSum);
//遍历该节点的右子树
if(root->right!=NULL)
Find(path, root->right, pathSum, currentSum);
//在返回父节点之前,将父节点弹栈
path.pop_back();
}
//测试
int main(void)
{
int data[] = {5, 10, 5, 12, 4, 7};
BTNode *root = NULL;
int pathSum = 22;
insert_node(&root, data, 1);
FindPath(root, pathSum);
return 0;
}

其中二叉树的数据结构定义为

struct BTNode
{
int data;
BTNode *left;
BTNode *right;
}; //先序建立二叉树
void insert_node(BTNode **root, int *data, int i)
{
if(i<=data[0])
{
*root = new BTNode();
(*root)->data = data[i];
(*root)->left=NULL;
(*root)->right=NULL;
insert_node(&((*root)->left), data, 2*i);
insert_node(&((*root)->right), data, 2*i+1);
}
} void remove_node(BTNode *root)
{
if(root!=NULL)
{
BTNode *pDel = NULL;
remove_node(root->left);
remove_node(root->right);
delete root;
}
}

(以上部分摘抄自<<剑指Offer>>)


找出二叉树中和为n的路径的更多相关文章

  1. 2018.3.12 Leecode习题 给定一个整数数列,找出其中和为特定值的那两个数。

    给定一个整数数列,找出其中和为特定值的那两个数. 你可以假设每个输入都只会有一种答案,同样的元素不能被重用. 示例: 给定 nums = [2, 7, 11, 15], target = 9; 因为 ...

  2. 【二叉树的递归】04找出二叉树中路径和等于给定值的所有路径【Path Sum II】

    ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 给定一个二叉树和一个和,判断这个树 ...

  3. 剑指Offer23 二叉树中和为sum的路径

    /************************************************************************* > File Name: 23_FindPa ...

  4. linux下如何找出交叉编译器的某个库路径?

    答: 使用选项-print-file-name=<lib_name> 如列出libstdc++.so.6的库路径:aarch64-linux-gnu-gcc -print-file-nam ...

  5. 给定一个整数数组和一个目标值,找出数组中和为目标值的两个数 例如给定nums = [2,7,11,15],target = 9

    python解决方案 nums = [1,2,3,4,5,6] #假如这是给定的数组 target = 9 #假如这是给定的目标值 num_list = [] #用来装结果的容器 def run(nu ...

  6. python3实现在二叉树中找出和为某一值的所有路径

    在二叉树中找出和为某一值的所有路径请写一个程序创建一棵二叉树,并按照一定规则,输出二叉树根节点到叶子节点的路径.规则如下:1.从最顶端的根结点,到最下面的叶子节点,计算路径通过的所有节点的和,如果与设 ...

  7. 剑指Offer - 九度1368 - 二叉树中和为某一值的路径

    剑指Offer - 九度1368 - 二叉树中和为某一值的路径2013-11-23 03:46 题目描述: 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结 ...

  8. 剑指Offer面试题:23.二叉树中和为某一值的路径

    一.题目:二叉树中和为某一值的路径 题目:输入一棵二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.从树的根结点开始往下一直到叶结点所经过的结点形成一条路径.例如输入下图中二叉树和整数2 ...

  9. 剑指offer 二叉树中和为某一个值的路径

    剑指offer 牛客网 二叉树中和为某一个值的路径 # -*- coding: utf-8 -*- """ Created on Tue Apr 9 15:53:58 2 ...

随机推荐

  1. 联想A800新蜂ROM V1.1 基于官方4.0.4精简省电稳定

    ROM介绍 [出品]:新蜂工作室(基于官方) 1.源于官方:基于最稳定官方底包制作. 2.深度精简:自带APK数量从原厂包的131个降低到90个,精简31% 3.ROM包大小从原厂314MB精简到16 ...

  2. 如何得到动态链接库的输出函数tdump命令(225篇博文)

    有的时候,我们需要查看一个动态链接库的输出函数列表,有很多软件可以满足此要求,比如说 exeScope.不过,去下载一个软件总归是很麻烦,Delphi 本身就自带一个类似的工具,那就是 tdump.e ...

  3. Android短信监听(二)——利用ContentObserver实现短信监听

    MainActivity例如以下: package cc.testsmslistener; import cc.testsmslistener.SMSContentObserver.MessageLi ...

  4. QUIC简单介绍

    QUIC,即Quick UDP Internet Connection,类似于SPDY,相同也是由Google公司在现有已存协议之上进行了扩展设计,而旨在降低网络延迟.之前我曾介绍过SPDY的相关信息 ...

  5. Mac OS提示# 14:自己定义文件图标

    本教程的其余部分再一次错过了方法,和一些使用提示,做一些额外的,我们希望对大家有帮助.  自己定义图标      对于Mac OSX用户来说,Dashboard,Dock栏,壁纸以及各种键盘触摸板的快 ...

  6. CentOS 6.4下编译安装MySQL 5.6.16

    一.卸载旧版本号MySql 1.rpm卸载: 1> 检查安装包: rpm -qa | grep mysql 2> 普通删除: rpm -e mysql-5.6.16.rpm 3> 强 ...

  7. ubuntu install mysql server method

         recently try to install mysql in my computer so that  I can practise some sql statement on seve ...

  8. Easyui 让Window弹出居中

    原文:Easyui 让Window弹出居中 easyui1.3.2版本,window的弹出不会居中了.而dialog是会居中的,我们必须为为window的open事件做扩展 代码如下:只要加入以下代码 ...

  9. BZOJ 2809 APIO2012 dispatching Treap+启示式合并 / 可并堆

    题目大意:给定一棵树,选定一棵子树中的一些点,薪水和不能超过m,求点的数量*子树根节点的领导能力的最大值 考虑对于每一个节点,我们维护一种数据结构,在当中贪心寻找薪金小的雇佣. 每一个节点暴力重建一定 ...

  10. ssl https双向验证的配置与证书库的生成

    1.SSL认证 不须要特别配置,相关证书库生成看https认证中的相关部分 2.HTTPS认证 一.基本概念 1.单向认证,就是传输的数据加密过了,可是不会校验client的来源  2.双向认证,假设 ...