题目1368:二叉树中和为某一值的路径

来源:互联网 发布:yum wireshark 编辑:程序博客网 时间:2024/05/16 11:08

记录树中的编号,递归寻找路径直到叶子节点就行了

如果还没到叶子节点和就大于K就不用再递归了,减枝

注意要字典序输出,如果right大于left就会导致递归得不到字典序,交换左右

#include<cstdio>#include<cstring> #include<queue>using namespace std;typedef struct node{int val;int index;struct node *left,*right;void setVal(int v){this->val = v;left = right = NULL;}}Tree;void createTree(int n,Tree tree[]){for(int i=0;i<n;++i){int val,l,r;scanf("%d%d%d",&val,&l,&r);if(r < l){r ^= l;l ^= r;r ^= l;}tree[i].setVal(val);tree[i].index = i+1;if(l != -1){tree[i].left = &tree[l-1];}if(r != -1){tree[i].right = &tree[r-1];} }}int a[11111];void printRoad(Tree *tree,int k,int m,int index){m += tree->val;if(tree->left == NULL && tree->right == NULL && m == k){printf("A path is found: ");for(int i=0;i<index;++i)printf("%d ",a[i]);printf("%d\n",tree->index);}  if(tree->left != NULL && m < k){//printf("---%d\n",m);a[index] = tree->index;printRoad(tree->left,k,m,index+1);}  if(tree->right != NULL && m < k){a[index] = tree->index;printRoad(tree->right,k,m,index+1);}}int main(){int n,k;while(scanf("%d%d",&n,&k) != EOF){Tree tree[11111];createTree(n,tree); printf("result:\n");printRoad(tree,k,0,0);}return 0;}


0 0
原创粉丝点击