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

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

    4     8

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

  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. }  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值