输出二叉树路径上的所有和为K的路径

来源:互联网 发布:衣柜 知乎 编辑:程序博客网 时间:2024/04/30 17:55

太坑爹了

1、可能有负值

2、左右子树的大小不保证左边<右边

#include<stdio.h>#include<stdlib.h>#include<vector>using namespace std;int n,k;struct Node{    int v,id;    Node *left,*right;    Node():left(NULL),right(NULL){}};Node* nd[10005];vector<int> vec;void print(vector<int> v){printf("A path is found: ");    for(int i=0;i<v.size();i++){if(i!=v.size()-1)            printf("%d ",v[i]);        else            printf("%d",v[i]);}printf("\n");}int res;void find_path(Node* root,int k){    if(root==NULL) return;    res+=root->v;    vec.push_back(root->id);    if(res==k&&root->left==NULL&&root->right==NULL){    print(vec);    //return;这儿不能直接return,要减去之后才能return}//if(res>k) return;if(root->left!=NULL)    find_path(root->left,k);if(root->right!=NULL)find_path(root->right,k);res-=root->v;vec.pop_back();}int main(){while(scanf("%d%d",&n,&k)!=EOF){printf("result:\n");for(int i=1;i<=n;i++)    nd[i]=new Node;    int v,l,r;for(int i=1;i<=n;i++){    scanf("%d%d%d",&v,&l,&r);    //这是太奇怪了,由于要求字典序,因此这里需要交换     if(l>0) nd[i]->left=nd[l];    if(r>0) nd[i]->right=nd[r];    if(l>r){    Node* tmp=nd[i]->left;    nd[i]->left=nd[i]->right;    nd[i]->right=tmp;}nd[i]->v=v;nd[i]->id=i;}res=0;vec.clear();find_path(nd[1],k);for(int i=1;i<=n;i++)    delete nd[i];}//system("pause");    return 0;}