题目:输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。
例如输入整数22和如下二元树


则打印出两条路径:10, 12和10, 5, 7。
二元树结点的数据结构定义为:

  1. struct BinaryTreeNode // a node in the binary tree  
  2.  { int m_nValue; // value of node  
  3.  BinaryTreeNode *m_pleft; // left child of node   
  4.  BinaryTreeNode *m_pright; // right child of node   
  5. }

思路:当访问到某一结点时,把该结点添加到路径上,并累加当前结点的值。如果当前结点为叶结点并且当前路径的和刚好等于输入的整数,则当前的路径符合要求,我们把它打印出来。如果当前结点不是叶结点,则继续访问它的子结点。当前结点访问结束后,递归函数将自动回到父结点。因此我们在函数退出之前要在路径上删除当前结点并减去当前结点的值,以确保返回父结点时路径刚好是根结点到父结点的路径。

代码:

 

  1. #include <iostream>  
  2. #include<vector>  
  3. using namespace std;  
  4.    
  5. struct BinaryTreeNode // a node in the binary tree  
  6.  { int m_nValue; // value of node  
  7.  BinaryTreeNode *m_pleft; // left child of node   
  8.  BinaryTreeNode *m_pright; // right child of node   
  9. };  
  10.  
  11. void FindPaths(BinaryTreeNode  * node,vector<int> &path,int totalsum,int &currentsum)  
  12. {  
  13.     if(!node)  
  14.         return;  
  15.     currentsum+=node->m_nValue;  
  16.     path.push_back(node->m_nValue);  
  17.     if(node->m_pleft==NULL&&node->m_pright==NULL&&currentsum==totalsum)  
  18.     {  
  19.         vector<int>::iterator iter=path.begin();  
  20.         for(;iter!=path.end();iter++)  
  21.         {  
  22.             cout<<*iter<<"\t";  
  23.         }  
  24.          cout<<endl;  
  25.     }  
  26.     if(node->m_pleft)  
  27.         FindPaths(node->m_pleft,path,totalsum,currentsum);  
  28.     if(node->m_pright)  
  29.         FindPaths(node->m_pright,path,totalsum,currentsum);  
  30.     currentsum-=node->m_nValue;  
  31.     path.pop_back();  
  32. }  
  33.  
  34. void main()  
  35. {  
  36.     BinaryTreeNode  tree[4];  
  37.     tree[0].m_nValue=10;  
  38.     tree[1].m_nValue=5;  
  39.     tree[2].m_nValue=12;  
  40.     tree[3].m_nValue=4;  
  41.     tree[4].m_nValue=7;  
  42.     tree[0].m_pleft=&tree[1];  
  43.     tree[1].m_pleft=&tree[3];  
  44.     tree[0].m_pright=&tree[2];  
  45.     tree[1].m_pright=&tree[4];  
  46.     tree[3].m_pleft=tree[3].m_pright=NULL;  
  47.     tree[2].m_pleft=tree[2].m_pright=NULL;  
  48.     tree[4].m_pleft=tree[4].m_pright=NULL;  
  49.     vector<int> path;  
  50.     int sum=0;  
  51.     FindPaths(&tree[0],path,22,sum);