题目1368:二叉树中和为某一值的路径
2014-07-19 11:35
253 查看
题目描述:
输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
输入:
每个测试案例包括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:”占一行,接下来按字典顺序输出满足条件的所有路径,这些路径由结点编号组成,输出格式参照输出样例。
代码一:dfs
代码二:
输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
输入:
每个测试案例包括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:”占一行,接下来按字典顺序输出满足条件的所有路径,这些路径由结点编号组成,输出格式参照输出样例。
代码一:dfs
#include<stdio.h> #include<stdlib.h> #define Max 10001 typedef struct tree { int data; int left; int right; }Node; Node *Atree[Max]; int getMin(int a,int b) { return (a <= b) ? a : b; } int getMax(int a,int b) { return (a >= b) ? a : b; } void create(Node *node[],int n) { int tmp,left,right; for(int i = 1; i <= n; i++) { scanf("%d %d %d",&tmp,&left,&right); int min = getMin(left,right); int max = getMax(left,right); node[i]->data = tmp; node[i]->left = min; node[i]->right = max; } } int top = -1; int path[Max]; void findPath(int id ,int sum,int k) { if(id == -1) return; sum += Atree[id]->data; top++; path[top] = id; if(sum == k && (Atree[id]->left == -1 && Atree[id]->right == -1)) { printf("A path is found:"); for(int i = 0; i <=top; i++) printf(" %d",path[i]); printf("\n"); return; } findPath(Atree[id]->left,sum,k); if(Atree[id]->left) top--; findPath(Atree[id]->right,sum,k); if(Atree[id]->right) top--; } int Sum = 0; void findPath1(int id, int k) { Node *node = Atree[id]; if(id == 1) { Sum = 0; while(top != -1) top--; } if(node->data + Sum == k && node->left == -1 && node->right == -1) { printf("A path is found:"); for(int i = 0; i <=top; i++) printf(" %d",path[i]); printf(" %d\n",id); return; } else { Sum += node->data; top++; path[top] = id; if(node->left != -1 && node->right == -1) findPath1(node->left,k); else if(node->right != -1 && node->left == -1) findPath1(node->right,k); else if(node->right != -1 && node->right != -1) { findPath1(node->left,k); findPath1(node->right,k); } top--; Sum -= node->data; } } int main() { int n,k; while(scanf("%d %d",&n,&k) != EOF) { int a[n + 1]; for(int i = 1; i <= n; i++) Atree[i] = new Node; create(Atree,n); printf("result:\n"); findPath1(1,k); //清空 for(int i = 1;i <= n;i++) { delete Atree[i]; Atree[i]=NULL; } top = -1; Sum = 0; } }
代码二:
#include<stdio.h> #include<stdlib.h> #define Max 10001 typedef struct tree { int mark;//节点的编号 int data; struct tree *left; struct tree *right; int num; //节点的父节点 }Node; Node *Atree[Max]; int getMin(int a,int b) { return (a < b) ? a : b; } int getMax(int a,int b) { return (a > b) ? a : b; } int p = 0; int path[Max]; void create(Node *node[],int n) { int tmp,left,right; for(int i = 1; i <= n; i++) { scanf("%d %d %d",&tmp,&left,&right); int min = getMin(left,right); int max = getMax(left,right); node[i]->mark = i; node[i]->data = tmp; if(min != -1 && max != -1) { node[i]->left = node[min]; node[i]->right = node[max]; node[min]->num = i; node[max]->num = i; } else if(min == -1 && max != -1) { node[i]->left = NULL; node[i]->right = node[max]; node[max]->num = i; } else if(min != -1 && right == -1) { node[i]->left = node[min]; node[i]->right = NULL; node[min]->num = i; } else { node[i]->left = NULL; node[i]->right = NULL; } } } void getChild(Node *root) { if(root->left == NULL && root->right == NULL) { path[p] = root->mark; p++; return; } else if(root->left != NULL && root->right != NULL) { getChild(root->left); getChild(root->right); } else if(root->left != NULL) { getChild(root->left); } else getChild(root->right); } void PrintPath(int n) { if(Atree != NULL) { PrintPath(Atree ->num); printf(" %d",Atree ->mark); } } int main() { int n,k; while(scanf("%d %d",&n,&k) != EOF) { int a[n + 1]; for(int i = 1; i <= n; i++) { Atree[i] = new Node; Atree[i]->num = 0; } create(Atree,n); getChild(Atree[1]); printf("result:\n"); for(int i = 0; i < p; i++) { int sum = 0; int j = path[i]; while(Atree[j] != NULL) { sum += Atree[j]->data; j = Atree[j]->num; } if(sum == k) { printf("A path is found:"); PrintPath(path[i]); printf("\n"); } } //清空 for(int i = 1;i <= n;i++) { delete Atree[i]; Atree[i]=NULL; } p = 0; } }
相关文章推荐
- 九度 题目1368:二叉树中和为某一值的路径
- 题目1368:二叉树中和为某一值的路径
- 【剑指Offer面试编程题】题目1368:二叉树中和为某一值的路径--九度OJ
- 题目1368:二叉树中和为某一值的路径
- 题目1368:二叉树中和为某一值的路径
- 九度 题目1368:二叉树中和为某一值的路径
- 题目1368:二叉树中和为某一值的路径
- 九度 题目1368:二叉树中和为某一值的路径
- 九度OJ-题目1368:二叉树中和为某一值的路径
- 题目1368:二叉树中和为某一值的路径-九度
- 题目1368:二叉树中和为某一值的路径
- 【剑指Offer面试编程题】题目1368:二叉树中和为某一值的路径--九度OJ
- 程序员面试题目总结--树(一)【重建二叉树、二叉树的深度、树的子结构、二叉树中和为某一值得路径、从上往下打印二叉树】
- 算法题目---二叉树中和为某一值的路径
- 剑指Offer - 九度1368 - 二叉树中和为某一值的路径
- 题目11:二叉树中和为某一值的路径
- *【九度OJ1368】|【剑指offer25】二叉树中和为某一值的路径
- 【剑指Offer面试题】 九度OJ1368:二叉树中和为某一值的路径
- JD 1368:二叉树中和为某一值的路径
- 【剑指Offer面试题】 九度OJ1368:二叉树中和为某一值的路径