在二元树中找出和为某一值的所有路径
题目:输入一个整数和一棵二元树。
从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。
打印出和与输入整数相等的所有路径。
例如
输入整数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 }