前段时间什么也不懂,就跑到腾讯去面试,然后面试官出了这道题,当时已碰算法就闷,现在给出这道题目的解
另外再次感谢July仁兄对于各种面试题的整理,让我有这些经典的题来练习。
题目:输入一个整数和一棵二元树。
从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。
打印出和与输入整数相等的所有路径。
例如输入整数22 和如下二元树
10
/ \
5 12
/ \
4 7
则打印出两条路径:10, 12 和10, 5, 7。
二元树节点的数据结构定义为:
struct BinaryTreeNode // a node in the binary tree
{
int m_nValue; // value of node
BinaryTreeNode *m_pLeft; // left child of node
BinaryTreeNode *m_pRight; // right child of node
};
分析:
这道题,用树的遍历就可以做出来用一个变量记录从跟节点到叶子节点值,另外还要在遍历完叶子节点,以及中间节点左右子树都遍历完以后减去相应值,即可。下面贴出个人代码
/*
查找等于某一个值的所有路径
*/
vector<Node<int>*> vec;
int curSum=0;
int c=0;//记录个数
void FindRoute(int sum,Node<int> * p){
if(p!=nullptr){
vec.push_back(p);
curSum+=p->GetData();
if(p->GetLeftChild()==nullptr&&p->GetRightChild()==nullptr)
{
if(curSum==sum){//如果叶子节点的和==sum输出
for(int i=0;i<vec.size();i++)
{
cout<<vec[i]->GetData()<<" ";
}
cout<<endl;
c++;
}
curSum-=vec.back()->GetData();
vec.pop_back();
return ;
}
else{
if(p->GetLeftChild()!=nullptr)
{
FindRoute(sum,p->GetLeftChild());
}
if(p->GetRightChild()!=nullptr){
FindRoute(sum,p->GetRightChild());
}
curSum-=vec.back()->GetData();
vec.pop_back();
}
}
}
测试用例:
int main(){
BinaryTree<int> bin(1);
Node<int>* r=bin.GetRoot();
r->SetLeftChild(new Node<int>(2));
r->SetRightChild(new Node<int>(1));
r->GetLeftChild()->SetLeftChild(new Node<int>(3));
r->GetLeftChild()->SetRightChild(new Node<int>(4));
r->GetRightChild()->SetLeftChild(new Node<int>(4));
r->GetRightChild()->SetRightChild(new Node<int>(3));
r->GetRightChild()->GetRightChild()->SetLeftChild(new Node<int>(1));
bin.MidOrder(r);
cout<<endl;
FindRoute(6,r);
cout<<endl<<"sum"<<c;
system("pause");
}