题目链接地址:
pid=1368
题目1368:二叉树中和为某一值的路径
时间限制:1 秒内存限制:32 兆特殊判题:否提交:2252解决:562
题目描写叙述: 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的全部路径。路径定义为从树的根结点開始往下一直到叶结点所经过的结点形成一条路径。
输入: 每一个測试案例包含n+1行: 第一行为2个整数n。k(1<=n<=10000)。n表示结点的个数。k表示要求的路径和。结点编号从1到n。 接下来有n行。这n行中每行为3个整数vi,leftnode,rightnode。vi表示第i个结点的值。leftnode表示第i个结点的左孩子结点编号,rightnode表示第i个结点的右孩子结点编号。若无结点值为-1。编号为1的结点为根结点。输出: 相应每一个測试案例。先输出“result:”占一行,接下来按字典顺序输出满足条件的全部路径,这些路径由结点编号组成,输出格式參照输出例子。
例子输入: 5 22 10 2 3 5 4 5 12 -1 -1 4 -1 -1 7 -1 -1 1 5 1 -1 -1 例子输出: result: A path is found: 1 2 5 A path is found: 1 3 result:
思路分析:
DFS遍历,vector存储路径,sum记录路径和。採用回溯的方法进行节点的输出。
时间复杂度O(n)。 遍历过程中须要存储路径。vector的空间复杂度为O(log(n))。代码:
/********************************* 【剑指Offer面试题】 九度OJ1368:二叉树中和为某一值的路径Author:牧之丶 Date:2015年Email:bzhou84@163.com **********************************/ #include#include #include #include #include #include #include using namespace std; struct Node{ int value; int lchild; int rchild;}nodes[10005];vector result;void dfs(int count,int sum,int i){ if(i==-1) return ; if(sum==count+nodes[i].value&&nodes[i].lchild==-1&&nodes[i].rchild==-1) { result.push_back(i); printf("A path is found:"); for(int j=0;j count+nodes[i].value) { result.push_back(i); dfs(count+nodes[i].value,sum,nodes[i].lchild); dfs(count+nodes[i].value,sum,nodes[i].rchild); result.pop_back(); }}int main(){ int num,sum; //freopen("data.in","r",stdin); while(scanf("%d%d",&num,&sum)!=EOF) { result.clear(); for(int i=1;i<=num;i++) { scanf("%d%d%d",&nodes[i].value,&nodes[i].lchild,&nodes[i].rchild); if(nodes[i].lchild>nodes[i].rchild) { int tmp=nodes[i].lchild; nodes[i].lchild=nodes[i].rchild; nodes[i].rchild=tmp; } } printf("result:\n"); dfs(0,sum,1); } return 0;}/************************************************************** Problem: 1368 Language: C++ Result: Accepted Time:30 ms Memory:1140 kb****************************************************************/