题目:输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出
和与输入整数相等的所有路径。
例如输入整数22和如下二元树
10
/ \
5 12
/ \
4 7
则打印出两条路径:10, 12和10, 5, 7。
分析:这是百度的一道笔试题,考查对树这种基本数据结构以及递归函数的理解。
当访问到某一结点时,把该结点添加到路径上,并累加当前结点的值。如果当前结点为叶结点并且当前路径的和刚好等
于输入的整数,则当前的路径符合要求,我们把它打印出来。如果当前结点不是叶结点,则继续访问它的子结点。当前
结点访问结束后,递归函数将自动回到父结点。因此我们在函数退出之前要在路径上删除当前结点并减去当前结点的
值,以确保返回父结点时路径刚好是根结点到父结点的路径。我们不难看出保存路径的数据结构实际上是一个栈结构,
因为路径要与递归调用状态一致,而递归调用本质就是一个压栈和出栈的过程。
参考代码:
//============================================================================
// Name : SumPathOfTree.cpp
// Author : Lee
// Version :
// Copyright : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================
#include <iostream>
#include<vector>
using namespace std;
class Node{
public:
int data;
Node * left;
Node * right;
Node():data(0),left(NULL),right(NULL){}
};
class Tree{
private:
Node * tree;
vector<int> vec;
Node * createTree(Node * node);
void viewTree(Node * tree);
void printPath(Node * tree,int M);
public:
Tree():tree(NULL){}
void print(int M){
printPath(tree,M);
}
void getTree(){
viewTree(tree);
}
void setTree();
};
void Tree::setTree(){
tree=createTree(tree);
}
Node * Tree::createTree(Node * node){
int data=0;
cin>>data;
if(0!=data){
node=new Node();
node->data=data;
}else{
return NULL;
}
node->left=createTree(node->left);
node->right=createTree(node->right);
return node;
}
void Tree::viewTree(Node * tree){
if(tree->left!=NULL){
viewTree(tree->left);
}
cout<<tree->data<<endl;
if(tree->right!=NULL){
viewTree(tree->right);
}
}
void Tree::printPath(Node * tree,int M){
vec.push_back(tree->data);
if(NULL==tree->left&&NULL==tree->right){
int sum=0;
vector<int>::iterator itr=vec.begin();
while(itr!=vec.end()){
sum+=*(itr++);
}
if(M==sum){
itr=vec.begin();
while(itr!=vec.end()){
cout<<*(itr++)<<endl;
}
cout<<"over"<<endl;
}
}else{
if(NULL!=tree->left){
printPath(tree->left,M);
}
if(NULL!=tree->right){
printPath(tree->right,M);
}
}
vec.pop_back();
}
int main() {
cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!!
Tree tree;
tree.setTree();
tree.getTree();
cout<<"get Path:"<<endl;
tree.print(6);
return 0;
}
/*
3
2
-2
0
3
0
0
1
0
0
4
0
0
*/
上边注释部分为输入的建树的数据,下边为整个程序的运行结果
!!!Hello World!!!
3
2
-2
0
3
0
0
1
0
0
4
0
0
-2
3
2
1
3
4
get Path:
3
2
-2
3
over
3
2
1
over