二叉树中的和,求路径

题目描述:已知二叉树和一个确定的值,求二叉树中的路径上节点的和满足给定的值,输出这些路径。

 

题目和算法解析:我们知道二叉树中的路径是指从根节点到叶子节点的。一定是从根节点出发的。所以我们需要有一种数据结构能够记录我们走过的路径。想到了栈。算法需要从根节点开始采用  前序遍历的思想逐个去校验是否符合条件。

 

算法实现;

 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 } 

实现效果;

posted @ 2016-04-11 20:07  Dormant  阅读(681)  评论(0编辑  收藏  举报