题目:输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。
例如输入整数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
}
分析:首先想到的是中序遍历。
void FindPath(BinaryTreeNode* pTreeNode,int expectedSum,vector<BinaryTreeNode*> &path,int &sum){
if(root==NULL){
return;
}
BinaryTreeNode* pNode=root;
vector<BinaryTreeNode*> path;
int sum=0;
sum+=pNode->m_nValue;
path.push_back(pNode);
bool isLeaf=(pNode->m_pLeft==NULL && pNode->m_pRight==NULL);
if(isLeaf && sum==expectedSum){
for(int i=0;i<path.size();i++){
cout<<path[i]->m_nValue<<ends;
}
}else{
if(pNode->p_mLeft!=NULL){
FindPath(pNode->p_mLeft,expectedsum,path,sum);
}
if(pNode->p_mRight!=NULL){
FindPath(pNode->p_mRight,expectedsum,path,sum);
}
}
//return to its parent
sum-=pNode->m_nValue;
path.pop_back();
}