找出二叉树中和为n的路径
题目描述:
输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和
与输入整数相等的所有路径。
二叉树中的路径
从二叉树的根节点出发,至二叉树的叶子节点的一条直线,称为二叉树的一条路径
例如:输入整数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的路径的更多相关文章
- 2018.3.12 Leecode习题 给定一个整数数列,找出其中和为特定值的那两个数。
给定一个整数数列,找出其中和为特定值的那两个数. 你可以假设每个输入都只会有一种答案,同样的元素不能被重用. 示例: 给定 nums = [2, 7, 11, 15], target = 9; 因为 ...
- 【二叉树的递归】04找出二叉树中路径和等于给定值的所有路径【Path Sum II】
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 给定一个二叉树和一个和,判断这个树 ...
- 剑指Offer23 二叉树中和为sum的路径
/************************************************************************* > File Name: 23_FindPa ...
- linux下如何找出交叉编译器的某个库路径?
答: 使用选项-print-file-name=<lib_name> 如列出libstdc++.so.6的库路径:aarch64-linux-gnu-gcc -print-file-nam ...
- 给定一个整数数组和一个目标值,找出数组中和为目标值的两个数 例如给定nums = [2,7,11,15],target = 9
python解决方案 nums = [1,2,3,4,5,6] #假如这是给定的数组 target = 9 #假如这是给定的目标值 num_list = [] #用来装结果的容器 def run(nu ...
- python3实现在二叉树中找出和为某一值的所有路径
在二叉树中找出和为某一值的所有路径请写一个程序创建一棵二叉树,并按照一定规则,输出二叉树根节点到叶子节点的路径.规则如下:1.从最顶端的根结点,到最下面的叶子节点,计算路径通过的所有节点的和,如果与设 ...
- 剑指Offer - 九度1368 - 二叉树中和为某一值的路径
剑指Offer - 九度1368 - 二叉树中和为某一值的路径2013-11-23 03:46 题目描述: 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结 ...
- 剑指Offer面试题:23.二叉树中和为某一值的路径
一.题目:二叉树中和为某一值的路径 题目:输入一棵二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.从树的根结点开始往下一直到叶结点所经过的结点形成一条路径.例如输入下图中二叉树和整数2 ...
- 剑指offer 二叉树中和为某一个值的路径
剑指offer 牛客网 二叉树中和为某一个值的路径 # -*- coding: utf-8 -*- """ Created on Tue Apr 9 15:53:58 2 ...
随机推荐
- JSP的include指令
JSP的include 指令:向当前页面中插入的一个静态文件的内容. 在test5.jsp里面 <%@ include file="test5_1.jsp" %> 新建 ...
- Indy的TCPServer到底能支持多少个连接
最近一个项目,最开始使用IdTcpServer,在大压力测试的时候,只连接了800个多一点的客户端(每个客户端连接上之后每秒钟发送一个几十字节的报文,服务器应答).但是持续的时间不会超过10分钟,服务 ...
- pptv web前端面试题
今天上午一考完试,就一直等待pptv的电话,结果下午就收到了pptv的通知(pptv的效率还是很不错的,之前面试官和我说在一到两周之内给回复,结果过了7天就给回复了,赞一个)因为我面试的是web前端( ...
- NetAnalyzer2016使用方法
NetAnalyzer笔记 之 八 NetAnalyzer2016使用方法(2) [创建时间:2016-05-06 22:07:00] NetAnalyzer下载地址 在写本篇的时候,NetAna ...
- 【Android】读取sdcard卡上的全部图片而且显示,读取的过程有进度条显示
尽管以下的app还没有做到快图浏览.ES文件浏览器的水平,遇到大sdcard还是会存在读取过久.内存溢出等问题,可是基本思想是这种. 例如以下图.在sdcard卡上有4张图片, 打开app,则会吧sd ...
- 设备管理 USB ID
发现个USB ID站点,对于做设备管理识别的小伙伴特别实用 http://www.linux-usb.org/usb.ids 附录: # # List of USB ID's # # Maintain ...
- HDU 1498 50 years, 50 colors(最小点覆盖,坑称号)
50 years, 50 colors Problem Description On Octorber 21st, HDU 50-year-celebration, 50-color balloons ...
- Nagios监控系统的安装
环境:centOS 6.5 X86 64位 nagios-4.08 步骤: 1. 最小化安装系统 2. 修改安全特性 关闭SELINUX SELINUX=disabled 清除iptabl ...
- android greenDao SQLite数据库操作使用的工具
关于如何建立类生成一个演示project.今天介绍如何使用. 这是ExampleDaoGeneratorproject代码,做了一些改动 /* * Copyright (C) 2011 Markus ...
- HADOOP2.6
LINUX下HADOOP2.6.0集群环境的搭建 本文旨在提供最基本的,可以用于在生产环境进行Hadoop.HDFS分布式环境的搭建,对自己是个总结和整理,也能方便新人学习使用. 基础环境 JDK的安 ...