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

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

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

 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 }

  测试结果如下:

原文地址:https://www.cnblogs.com/ldjhust/p/3051895.html