题目描述:已知二叉树和一个确定的值,求二叉树中的路径上节点的和满足给定的值,输出这些路径。
题目和算法解析:我们知道二叉树中的路径是指从根节点到叶子节点的。一定是从根节点出发的。所以我们需要有一种数据结构能够记录我们走过的路径。想到了栈。算法需要从根节点开始采用 前序遍历的思想逐个去校验是否符合条件。
算法实现;
1 #include<iostream> 2 #include<vector> 3 using namespace std; 4 5 typedef struct BiTreeNode{ 6 int data; 7 struct BiTreeNode *left; 8 struct BiTreeNode *right; 9 }BiTreeNode; 10 11 void FindPathCore(BiTreeNode *pHead, int sum, vector<int>& path, int currentSum){ 12 currentSum += pHead->data; 13 path.push_back(pHead->data); 14 15 //如果是叶子节点,并且路径上的节点的等于输入的值,打印这条路径 16 bool isLeaf = pHead->left == NULL && pHead->right == NULL; 17 if(currentSum == sum && isLeaf){ 18 cout<<"The path is: "; 19 vector<int>::iterator iter = path.begin(); 20 for(; iter != path.end(); ++iter){ 21 cout<<*iter<<' '; 22 } 23 24 cout<<endl; 25 } 26 27 //如果不是叶子节点,需要遍历它的子节点 28 if(currentSum < sum && pHead->left != NULL){ //如果当前的和已经大于期望的和,那么久不需要再向下寻找了 29 FindPathCore(pHead->left, sum, path, currentSum); 30 } 31 if(currentSum < sum && pHead->right != NULL){ 32 FindPathCore(pHead->right, sum, path, currentSum); 33 } 34 //返回父节点之前,在路径上删除当前节点 35 path.pop_back(); 36 } 37 38 void FindPath(BiTreeNode *pHead, int sum){ 39 if(pHead == NULL){ 40 return ; 41 } 42 43 vector<int> path; 44 int currentSum = 0; 45 FindPathCore(pHead, sum, path, currentSum); 46 } 47 48 BiTreeNode *createTree(){ //前序遍历的方法创建一棵二叉树 49 int item; 50 BiTreeNode *pNode = NULL; 51 cin>>item; 52 53 if(item != -1){ 54 BiTreeNode *tmp = new BiTreeNode(); 55 pNode = tmp; 56 tmp->data = item; 57 58 pNode->left = createTree(); 59 pNode->right = createTree(); 60 61 return pNode; 62 } 63 else{ 64 pNode = NULL; 65 return pNode; 66 } 67 } 68 69 int main(){ //测试方法 70 BiTreeNode *test = createTree(); 71 FindPath(test, 22); 72 return 0; 73 }
实现效果;