【算法题】打印二元查找树中元素和等于指定数的所有路径

来源:互联网 发布:ip地址显示在阿里云 编辑:程序博客网 时间:2024/05/16 10:34

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

    4     8

则打印出两条路径:10, 14 和10, 6, 8。

[cpp] view plaincopyprint?
  1. #include <iostream>  
  2. using namespace std;  
  3. #define MAX_LEN 20  
  4.   
  5. typedef struct Node  
  6. {  
  7.     Node() : v(0), left(NULL), right(NULL) {}  
  8.     Node(int _v, Node *l=NULL, Node *r=NULL) : v(_v), left(l), right(r) {}  
  9.     int v;  
  10.     Node *left;  
  11.     Node *right;  
  12. }sNode;  
  13.   
  14. //LB_c: 利用递归和回溯方法,注意参数arr是数组的引用(每次递归用的是同一个数组,不会多次分配)  
  15. void checkSum(sNode *cur, int sum, int (&arr)[MAX_LEN], int idx)  
  16. {  
  17.     sum -= cur->v;  
  18.     arr[idx++] = cur->v;  
  19.   
  20.     //LB_c: 左右孩子都是NULL,即cur为叶子节点  
  21.     if ( (NULL == cur->left) && (NULL == cur->right) )  
  22.     {  
  23.     //LB_c: 如果当前要查找的节点和为0,则到当前节点的路径就是要着的路径,arr中记录了该路径中个节点的值   
  24.     if (0 == sum)      
  25.     {  
  26.         for (int i=0; i<idx; i++)  
  27.         {  
  28.         cout << arr[i] << " ";  
  29.         }  
  30.         cout << endl;  
  31.     }  
  32.     return;  
  33.     }  
  34.     else  
  35.     {  
  36.     checkSum(cur->left, sum, arr, idx);  
  37.     checkSum(cur->right, sum, arr, idx);  
  38.     }  
  39.   
  40.     //LB_c: 这里很关键,当前节点的子树已经遍历完,这里需要“恢复”到遍历前进行回溯!  
  41.     sum += cur->v;  
  42.     --idx;  
  43. }  
  44.   
  45. int main()  
  46. {  
  47.     //create BST  
  48.     sNode n1(4);  
  49.     sNode n2(8);  
  50.     sNode n3(6, &n1, &n2);   
  51.     sNode n4(14);  
  52.     sNode root(10, &n3, &n4);  
  53.   
  54.     //call checkSum()  
  55.     int res[MAX_LEN];  
  56.     checkSum(&root, 24, res, 0);  
  57.   
  58.     return 0;  
  59. }