对于这个问题我们可以利用前序遍历搜索二叉树的每一条路径,并利用栈保存找到的路径,然后判断此路径是否符合要求,若符合要求则输出此路径,否则继续寻找下一条路径。即利用回溯和递归的思想。
基于上述分析,可写出如下获取并判断路径的方法:
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 }
测试结果如下: