IT公司100题-4-在二元树中找出和为某一值的所有路径
2014-07-29 12:08
225 查看
问题描述:
输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。
例如输入整数30和如下二元树
14
/ \
5 16
/ \
3 11
则打印出两条路径:14, 16 和14, 5, 11。
二元树节点的数据结构定义为:
在遍历树的过程中,使用stack保存所走过的路径。如果当前节点为叶子节点,并且路径和等于输入的整数,则输出路径。如果当前节点不是叶子节点,则递归的访问它的孩子节点。在回溯的过程中,注意路径的出栈。
代码实现:
转载自源代码
本文链接地址: http://w.worthsee.com/index.php/4-%e5%9c%a8%e4%ba%8c%e5%85%83%e6%a0%91%e4%b8%ad%e6%89%be%e5%87%ba%e5%92%8c%
输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。
例如输入整数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, 14);
add_BSTree_node(root, 16);
add_BSTree_node(root, 5);
add_BSTree_node(root, 3);
add_BSTree_node(root, 11);
vector<int> path;
int target = 30;
int current_sum = 0;
find_path(root, target, path, current_sum);
return 0;
}
转载自源代码
本文链接地址: http://w.worthsee.com/index.php/4-%e5%9c%a8%e4%ba%8c%e5%85%83%e6%a0%91%e4%b8%ad%e6%89%be%e5%87%ba%e5%92%8c%
相关文章推荐
- 微软等数据结构+算法面试100题(45)-- 在二元树中找出和为某一值的所有路径
- 程序员面试题100题第04题——在二元树中找出和为某一值的所有路径
- 微软100题(4) 在二元树中找出和为某一值的所有路径
- 程序员面试题精选100题(04)-在二元树中找出和为某一值的所有路径—python实现
- 二元树中找出何为某一值的所有路径 【微软面试100题 第四题】
- 程序员面试题100题第04题——在二元树中找出和为某一值的所有路径
- 程序员面试100题---4.在二元树中找出和为某一值的所有路径(树)
- 微软100题第4题(在二元树中找出和为某一值的所有路径)
- 100题_04 在二元树中找出和为某一值的所有路径
- 程序员面试题精选100题(04)-在二元树中找出和为某一值的所有路径
- 程序员面试题精选100题(04)-在二元树中找出和为某一值的所有路径
- 面试100题004--二元树中找出和为某一值的所有路径
- 程序员面试100题之四,在二元树中找出和为某一值的所有路径
- 面试100题:4.在二元树中找出和为某一值的所有路径
- 在二元树中找出何为某一值的所有路径 【微软面试100题 第四题】
- 算法面试100题——4.在二元树中找出和为某一值的所有路径
- 微软面试100题-4.在二元树中找出和为某一值的所有路径
- 程序员面试题精选100题(04)-在二元树中找出和为某一值的所有路径
- 在二元树中找出和为某一值的所有路径
- 算法讨论(三)---在二元树中找出和为某一值的所有路径