记录树中的编号,递归寻找路径直到叶子节点就行了
如果还没到叶子节点和就大于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;
}