1. 题目:输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。
思路:典型的背包问题。二叉树数据结构可采用顺序存储方式,对于非完全二叉树,采用补0的方式构成顺序数组。
代码:
#include <iostream>
#include<vector>
using namespace std;
vector<int> path;
//计算和为n,从节点索引index开始到叶子节点的所有路径
void cal_path(vector<int> &a,int index,int n)
{
if(index>=a.size())
return;
if(n==a[index]&&((2*index+1>=a.size())||(a[2*index+1]==0)))
{
path.push_back(a[index]);
for(auto i:path)
cout<<i<<"->";
cout<<"end\n";
path.pop_back(); //回溯
return;
}
int i=2*index+1;
int j=2*index+2;
if(i<a.size()&&a[i]!=0)
{
path.push_back(a[index]);
cal_path(a,i,n-a[index]);
path.pop_back(); //回溯
}
if(j<a.size()&&a[j]!=0)
{
path.push_back(a[index]);
cal_path(a,j,n-a[index]);
path.pop_back(); //回溯
}
}
int main()
{
vector<int> a;
a.push_back(10);
a.push_back(5);
a.push_back(12);
a.push_back(4);
a.push_back(7);
a.push_back(0);
a.push_back(0);
a.push_back(3);
cal_path(a,0,22);
return 0;
}
输出结果:
10->5->4->3->end
10->5->7->end
10->12->end
Process returned 0 (0x0) execution time : 0.030 s
Press any key to continue.