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

题目:输入一个整数和一棵二元树。
从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。
打印出和与输入整数相等的所有路径。
例如
输入整数22和如下二元树
  10  
  / /  
  5 12  
  / /  
  4
7
则打印出两条路径:10, 12和10, 5, 7。

题目来源:http://blog.csdn.net/v_july_v/article/details/5934051

View Code
  1 #include <iostream>
  2 #include <stack>
  3 #include <vector>
  4 
  5 using namespace std;
  6 
  7 /*************************************************
  8 //树节点结构
  9 *************************************************/
 10 struct tree_node
 11 {
 12     int data;
 13     tree_node *l_child;
 14     tree_node *r_child;
 15 };
 16 
 17 /*************************************************
 18 Function:       // insert_tree
 19 Description:    // 二叉树构建函数
 20 Input:          // root: 树根节点
 21                 // data: 节点数据
 22 Return:         // 无
 23 *************************************************/
 24 void insert_tree(tree_node *&root, int data)
 25 {
 26     tree_node *tp = new tree_node;
 27     tp->data = data;
 28     tp->l_child = NULL;
 29     tp->r_child = NULL;
 30     if(NULL == root)
 31     {
 32         root = tp;    
 33     }
 34     else
 35     {
 36         tree_node *temp, *temp2;
 37         temp = root;
 38         while (NULL != temp)
 39         {
 40             temp2  = temp;
 41             if(data > temp->data)
 42             {
 43                 temp = temp->r_child;
 44             }
 45             else
 46             {
 47                 temp = temp->l_child;
 48             }
 49         }
 50         if (data > temp2->data)
 51         {
 52             temp2->r_child = tp;
 53         }
 54         else
 55         {
 56             temp2->l_child = tp;
 57         }
 58     }
 59 }
 60 
 61 /*************************************************
 62 Function:       // delete_tree
 63 Description:    // 树节点内存释放函数
 64 Input:          // root: 树根节点
 65 Return:         // 无
 66 *************************************************/
 67 void delete_tree(tree_node *&root)
 68 {
 69     if(NULL != root)
 70     {
 71         delete_tree(root->l_child);
 72         delete_tree(root->r_child);
 73         delete root;
 74     }
 75 }
 76 
 77 /*************************************************
 78 Function:       // recursion
 79 Description:    // 二叉树便利函数,遍历整个二叉树记录
 80                 // 所有路径节点和等于给定值得路径
 81 Input:          // root: 树根节点
 82                 // sub_sum: 递归到该节点时已经积累的节点和
 83                 // total_sum: 给定的路径和
 84                 // vec: 该路径上所记录的几点
 85 Return:         // 无
 86 *************************************************/
 87 void recursion(tree_node *root, int sub_sum, int total_sum, vector<int> &vec)
 88 {
 89     vector<int> local_route;
 90     vector<int>::iterator it;
 91     int temp;
 92     temp = sub_sum + root->data;
 93     //判断是否为叶子节点,若为叶子节点并且该路径节点值得和为给定值则输出该路径
 94     if ((NULL == root->l_child) && (NULL == root->r_child) && temp == total_sum)
 95     {
 96         it = vec.begin();
 97         while(it != vec.end())
 98         {
 99             cout << *it++ << " ";
100         }
101         cout << root->data;
102         cout << endl;
103         return;            
104     }
105     //若到该节点为止的所有节点值得和小于给定值而且该节点的子节点不为空则继续遍历
106     else if(total_sum >= temp && ((NULL != root->l_child) || (NULL != root->r_child)))
107     {
108         for(it = vec.begin(); it != vec.end(); ++it)
109         {
110             local_route.push_back(*it);
111         }
112         local_route.push_back(root->data);
113         int temp;
114         temp = sub_sum + root->data;
115         if(NULL != root->l_child && temp <= total_sum)
116         {
117             recursion(root->l_child, temp, total_sum, local_route);
118         }
119         if(NULL != root->r_child && temp <= total_sum)
120         {
121             recursion(root->r_child, temp, total_sum, local_route);
122         }
123     }    
124     return;
125 }
126 
127 /*************************************************
128 Function:       // print_route
129 Description:    // 封装recursion函数
130 Input:          // root: 树根节点
131                 // sum: 给定的路径节点的和
132 Return:         // 无
133 *************************************************/
134 void print_route(tree_node *root, int sum)
135 {
136     vector<int> vec;
137     recursion(root, 0, sum, vec);    
138 }
139 
140 int main()
141 {
142     tree_node *root = NULL;
143     insert_tree(root, 10);
144     insert_tree(root, 12);
145     insert_tree(root, 5);
146     insert_tree(root, 4);
147     insert_tree(root, 7);
148     print_route(root, 22);
149     delete_tree(root);
150     return 0;
151 }

 

posted on 2013-04-12 16:26  blue firmament  阅读(181)  评论(0编辑  收藏  举报