C++ 二叉树中和为某一值的路径

来源:互联网 发布:象棋小鹤求败是软件 编辑:程序博客网 时间:2024/06/07 10:28

思路:递归、判断技术条件、采用vector

代码:

/*题目:输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。丛书的根结点开始往下一直到叶节点所经过的节点形成一条路径*/#include <iostream>#include <vector>#include <stdio.h>#include "BinaryTree.h"using namespace std;//to declarevoid FindPath(TreeNode* proot, int Sum, vector <int>& path, int& current_sum);//to initializevoid FindPath(TreeNode* proot, int Sum){if(proot == NULL)return;int current_sum =0;vector <int> path ;FindPath(proot, Sum, path, current_sum);}// to recursevoid FindPath(TreeNode* pnode, int Sum,vector <int>& path,int& current_sum){current_sum += pnode -> m_value;path.push_back(pnode -> m_value);bool is_leaf = pnode -> pLeft ==NULL && pnode ->pRight == NULL;if(current_sum == Sum && is_leaf){cout<<"Here is a path: ";vector<int> :: iterator itr= path.begin();while(itr < path.end())cout<< *itr++ <<'\t';cout <<endl;}if(pnode -> pLeft != NULL)FindPath(pnode -> pLeft ,Sum, path,current_sum);if(pnode -> pRight != NULL)FindPath(pnode ->pRight , Sum, path,current_sum);current_sum -= pnode ->m_value;path.pop_back();}// ====================测试代码====================void Test(char* testName, TreeNode* pRoot, int expectedSum){    if(testName != NULL)        cout<<testName<< " begins"<<endl;    FindPath(pRoot, expectedSum);cout <<endl;}//            10//         /      \//        5        12//       /\        //      4  7     // 有两条路径上的结点和为22void Test1(){    TreeNode* pNode10 = CreateNode(10);    TreeNode* pNode5 = CreateNode(5);    TreeNode* pNode12 = CreateNode(12);    TreeNode* pNode4 = CreateNode(4);    TreeNode* pNode7 = CreateNode(7);    ConnectNodes(pNode10, pNode5, pNode12);    ConnectNodes(pNode5, pNode4, pNode7);    printf("Two paths should be found in Test1.\n");    Test("Test1", pNode10, 22);    DestroyTree(pNode10);}//            10//         /      \//        5        12//       /\        //      4  7     // 没有路径上的结点和为15void Test2(){    TreeNode* pNode10 = CreateNode(10);    TreeNode* pNode5 = CreateNode(5);    TreeNode* pNode12 = CreateNode(12);    TreeNode* pNode4 = CreateNode(4);    TreeNode* pNode7 = CreateNode(7);    ConnectNodes(pNode10, pNode5, pNode12);    ConnectNodes(pNode5, pNode4, pNode7);    printf("No paths should be found in Test2.\n");    Test("Test2", pNode10, 15);    DestroyTree(pNode10);}//               5//              ///             4//            ///           3//          ///         2//        ///       1// 有一条路径上面的结点和为15void Test3(){    TreeNode* pNode5 = CreateNode(5);    TreeNode* pNode4 = CreateNode(4);    TreeNode* pNode3 = CreateNode(3);    TreeNode* pNode2 = CreateNode(2);    TreeNode* pNode1 = CreateNode(1);    ConnectNodes(pNode5, pNode4, NULL);    ConnectNodes(pNode4, pNode3, NULL);    ConnectNodes(pNode3, pNode2, NULL);    ConnectNodes(pNode2, pNode1, NULL);    printf("One path should be found in Test3.\n");    Test("Test3", pNode5, 15);    DestroyTree(pNode5);}// 1//  \//   2//    \//     3//      \//       4//        \//         5// 没有路径上面的结点和为16void Test4(){    TreeNode* pNode1 = CreateNode(1);    TreeNode* pNode2 = CreateNode(2);    TreeNode* pNode3 = CreateNode(3);    TreeNode* pNode4 = CreateNode(4);    TreeNode* pNode5 = CreateNode(5);    ConnectNodes(pNode1, NULL, pNode2);    ConnectNodes(pNode2, NULL, pNode3);    ConnectNodes(pNode3, NULL, pNode4);    ConnectNodes(pNode4, NULL, pNode5);    printf("No paths should be found in Test4.\n");    Test("Test4", pNode1, 16);    DestroyTree(pNode1);}// 树中只有1个结点void Test5(){    TreeNode* pNode1 = CreateNode(1);    printf("One path should be found in Test5.\n");    Test("Test5", pNode1, 1);    DestroyTree(pNode1);}// 树中没有结点void Test6(){    printf("No paths should be found in Test6.\n");    Test("Test6", NULL, 0);}int main(){    Test1();    Test2();    Test3();    Test4();    Test5();    Test6();system("PAUSE");    return 0;}
binarytree的相关代码此处省略,可见以前博文
运行结果如下


0 0
原创粉丝点击