微软算法面试(4):在二元树中找出和为某一值的所有路径(树)
从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。
打印出和与输入整数相等的所有路径。
例如 输入整数22和如下二元树
10
/ /
5 12
/ \
4 7
则打印出两条路径:10, 12和10, 5, 7。
#include <iostream>
#include <list>
using namespace std;
struct BTree{
BTree(int _d = 0):data(_d),left(NULL), right(NULL) {}
int data;
BTree* left;
BTree* right;
void add(BTree* _bt)
{
if(_bt->data < data)
{
if(left == NULL)
left = _bt;
else
left->add(_bt);
}
else
{
if(right == NULL)
right = _bt;
else
right->add(_bt);
}
}
};
void findRoad(BTree* bt, int value, list<list<BTree*> >& lbt)
{
if(bt->left == NULL && bt->right == NULL)
{
if( value == bt->data)
{
list<BTree*> _lbt1;
_lbt1.push_back(bt);
lbt.push_back(_lbt1);
return;
}
}
if(bt->left != NULL)
{
findRoad(bt->left, value - bt->data, lbt);
}
if(bt->right != NULL)
{
findRoad(bt->right, value - bt->data, lbt);
}
if(lbt.size() > 0)
{
for(list<list<BTree*> >::iterator llit = lbt.begin(); llit != lbt.end(); ++ llit)
{
llit->push_front(bt);
}
}
}
int main()
{
BTree bt1(10);
BTree bt2(5);
BTree bt3(12);
BTree bt4(4);
BTree bt5(7);
BTree* root = &bt1;
root->add(&bt2);
root->add(&bt3);
root->add(&bt4);
root->add(&bt5);
list<list<BTree*> > lbt;
findRoad(root, 22, lbt);
for(list<list<BTree*> >::iterator llit = lbt.begin(); llit != lbt.end(); ++ llit)
{
for(list<BTree*>::iterator lit = llit->begin(); lit != llit->end(); ++ lit)
{
cout << (*lit)->data << ",";
}
cout << endl;
}
return 0;
}
结果如下:
10,5,7,
10,12,