例如输入整数22和如下二元树
10
/ \
5 12
/ \
4 7
则打印出两条路径:10, 12和10, 5, 7。
二元树节点的数据结构定义为:
struct BinaryTreeNode
{
int data;
BinaryTreeNode *pLeft;
BinaryTreeNode *pRight;
10
/ \
5 12
/ \
4 7
则打印出两条路径:10, 12和10, 5, 7。
二元树节点的数据结构定义为:
struct BinaryTreeNode
{
int data;
BinaryTreeNode *pLeft;
BinaryTreeNode *pRight;
};
和二叉树转换为双向链表类似,用递归,具体就不说了,可以参考另一篇文章
参考代码:
#include <stack>
#include <iostream>
#include <string.h>
using namespace std;
stack<int>s;
int n,k;
int a[100000];
int flag;
struct BinaryTreeNode
{
int data;
BinaryTreeNode *pLeft;
BinaryTreeNode *pRight;
};
void newset(BinaryTreeNode *&rode,int val)
{
if(rode==NULL)
{
BinaryTreeNode *Rode=new BinaryTreeNode();
Rode->data=val;
Rode->pLeft=NULL;
Rode->pRight=NULL;
rode=Rode;
}
if(rode->data<val)
{
newset(rode->pRight,val);
}
else if(rode->data>val)
{
newset(rode->pLeft,val);
}
}
void find(BinaryTreeNode *rode,int sum)
{
int i;
if(sum==n)
{
for(i=0;i<k;i++)
cout<<a[i]<<" ";
cout<<endl;
flag=1;
return ;
}
else if(rode==NULL||sum>n)
return ;
else if(sum==n)
{
for(i=k-1;i>=0;i--)
cout<<a[i]<<" ";
cout<<endl;
}
else if(sum<n)
{
a[k++]=rode->data;
find(rode->pLeft,sum+rode->data);
if(!flag)
find(rode->pRight,sum+rode->data);
flag=0;
}
k--;
}
int main()
{
BinaryTreeNode *s=NULL;
k=0;
n=22;
flag=0;
memset(a,0,sizeof(a));
newset(s,10);
newset(s,5);
newset(s,4);
newset(s,12);
newset(s,7);
find(s,0);
return 0;
}