在二叉树中找出和为某一值的所有路径

  对于这个问题我们可以利用前序遍历搜索二叉树的每一条路径,并利用栈保存找到的路径,然后判断此路径是否符合要求,若符合要求则输出此路径,否则继续寻找下一条路径。即利用回溯和递归的思想。

  基于上述分析,可写出如下获取并判断路径的方法:

 1 void GetRoad(BinaryTreeNode *root, int *Stack, int nTop, int nSum, int nValue)
 2 {
 3     assert (root != NULL);
 4 
 5     assert (Stack != NULL);
 6 
 7     assert (nTop >= -1);
 8 
 9     if ((NULL == root->lChild) && (NULL == root->rChild))
10     {
11         // 若当前节点是叶节点,则找到了这颗二叉树的一条路径,将也节点入栈,再判断这条路径是否符合要求
12         Stack[++nTop] = root->nData;
13         nSum += root->nData;
14 
15         if (nSum == nValue)
16         {
17             // 找到了一条路径,则路径数加1,并且将其打印出来
18             ++ROAD_NUM;
19 
20             PrintRoad (Stack, nTop);
21 
22             // 打印一条路径后换一行
23             cout << endl;
24         }
25 
26         return;
27     }
28 
29     nSum += root->nData;
30 
31     Stack[++nTop] = root->nData;
32 
33     GetRoad (root->lChild, Stack, nTop, nSum, nValue);
34 
35     GetRoad (root->rChild, Stack, nTop, nSum, nValue);
36 }

  若找到一条符合条件的路径,则可利用递归将保存在栈中的路径打印出来,代码如下:

 1 void PrintRoad(int *Stack, int nTop)
 2 {
 3     assert (Stack != NULL);
 4 
 5     if (-1 == nTop)
 6     {
 7         return;
 8     }
 9 
10     PrintRoad (Stack, nTop - 1);
11 
12     cout << Stack[nTop] << " ";
13 }

  以上就是解决这个问题的算法,接下来为了测试,我们用前序快速建立一颗二叉树,代码如下:

 1 // 前序快速创建一颗二叉树
 2 void CreateBinaryTree(BinaryTreeNode *&root)
 3 {
 4     int data;
 5 
 6     cout << "输入根节点,-1为空: ";
 7     cin >> data;
 8 
 9     if (-1 == data)
10     {
11         root = NULL;
12 
13         return;
14     }
15 
16     if (NULL == (root = (BinaryTreeNode *)malloc (sizeof (BinaryTreeNode))))
17     {
18         cout << "Fail to malloc space to root!\n";
19         getch ();
20     }
21 
22     root->nData = data;
23 
24     // 创建root的左子树
25     cout << "创建 " << root->nData <<" 的左子树\n";
26     CreateBinaryTree (root->lChild);
27 
28     // 创建右子树
29     cout << "创建 " << root->nData <<" 的右子树\n";
30     CreateBinaryTree (root->rChild);
31 }

  测试结果如下:

posted on 2013-04-30 14:36  ldjhust 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/ldjhust/archive/2013/04/30/3051895.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值