问题描述:
输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。
例如输入整数30和如下二元树
14
/ \
5 16
/ \
3 11
则打印出两条路径:14, 16 和14, 5, 11。
二元树节点的数据结构定义为:
typedef struct BSTree {
int data;
BSTree* left;
BSTree* right;
} tree_node;
在遍历树的过程中,使用stack保存所走过的路径。如果当前节点为叶子节点,并且路径和等于输入的整数,则输出路径。如果当前节点不是叶子节点,则递归的访问它的孩子节点。在回溯的过程中,注意路径的出栈。
代码实现:
// 4.cc
#include <iostream>
#include <vector>
using namespace std; // 二叉查找树
typedef struct BSTree {
int data;
BSTree* left;
BSTree* right;
} tree_node; // 创建二元查找树
void add_BSTree_node(tree_node* &p_current, int data) {
if (NULL == p_current) {
tree_node *node = new tree_node();
node->left = NULL;
node->right = NULL;
node->data = data;
p_current = node;
} else {
if (p_current->data > data)
add_BSTree_node(p_current->left, data);
else if (p_current->data < data)
add_BSTree_node(p_current->right, data);
else
cout << "The data has already in the tree.";
}
} void find_path(tree_node* root, int target, vector<int>& path, int& current_sum) {
if(!root)
return; current_sum += root->data;
path.push_back(root->data); // 是叶子节点,并且等于target
bool is_leaf = (!root->left && !root->right);
if(current_sum == target && is_leaf) {
for(vector<int>::iterator it = path.begin(); it != path.end(); ++it)
cout << *it << " ";
cout << endl;
} // 非叶子节点,遍历孩子
if(root->left)
find_path(root->left, target, path, current_sum);
if(root->right)
find_path(root->right, target, path, current_sum); // pop当前元素
current_sum -= root->data;
path.pop_back();
} int main() {
tree_node *root = NULL; add_BSTree_node(root, );
add_BSTree_node(root, );
add_BSTree_node(root, );
add_BSTree_node(root, );
add_BSTree_node(root, ); vector<int> path;
int target = ;
int current_sum = ;
find_path(root, target, path, current_sum); return ;
}
转载自源代码