【算法题】打印二元查找树中元素和等于指定数的所有路径
2013-04-19 17:30
369 查看
题目:输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。
例如:输入整数24和如下二元树
10
/ \
6 14
/ \
4 8
则打印出两条路径:10, 14 和10, 6, 8。
[cpp] view
plaincopyprint?
#include <iostream>
using namespace std;
#define MAX_LEN 20
typedef struct Node
{
Node() : v(0), left(NULL), right(NULL) {}
Node(int _v, Node *l=NULL, Node *r=NULL) : v(_v), left(l), right(r) {}
int v;
Node *left;
Node *right;
}sNode;
//LB_c: 利用递归和回溯方法,注意参数arr是数组的引用(每次递归用的是同一个数组,不会多次分配)
void checkSum(sNode *cur, int sum, int (&arr)[MAX_LEN], int idx)
{
sum -= cur->v;
arr[idx++] = cur->v;
//LB_c: 左右孩子都是NULL,即cur为叶子节点
if ( (NULL == cur->left) && (NULL == cur->right) )
{
//LB_c: 如果当前要查找的节点和为0,则到当前节点的路径就是要着的路径,arr中记录了该路径中个节点的值
if (0 == sum)
{
for (int i=0; i<idx; i++)
{
cout << arr[i] << " ";
}
cout << endl;
}
return;
}
else
{
checkSum(cur->left, sum, arr, idx);
checkSum(cur->right, sum, arr, idx);
}
//LB_c: 这里很关键,当前节点的子树已经遍历完,这里需要“恢复”到遍历前进行回溯!
sum += cur->v;
--idx;
}
int main()
{
//create BST
sNode n1(4);
sNode n2(8);
sNode n3(6, &n1, &n2);
sNode n4(14);
sNode root(10, &n3, &n4);
//call checkSum()
int res[MAX_LEN];
checkSum(&root, 24, res, 0);
return 0;
}
例如:输入整数24和如下二元树
10
/ \
6 14
/ \
4 8
则打印出两条路径:10, 14 和10, 6, 8。
[cpp] view
plaincopyprint?
#include <iostream>
using namespace std;
#define MAX_LEN 20
typedef struct Node
{
Node() : v(0), left(NULL), right(NULL) {}
Node(int _v, Node *l=NULL, Node *r=NULL) : v(_v), left(l), right(r) {}
int v;
Node *left;
Node *right;
}sNode;
//LB_c: 利用递归和回溯方法,注意参数arr是数组的引用(每次递归用的是同一个数组,不会多次分配)
void checkSum(sNode *cur, int sum, int (&arr)[MAX_LEN], int idx)
{
sum -= cur->v;
arr[idx++] = cur->v;
//LB_c: 左右孩子都是NULL,即cur为叶子节点
if ( (NULL == cur->left) && (NULL == cur->right) )
{
//LB_c: 如果当前要查找的节点和为0,则到当前节点的路径就是要着的路径,arr中记录了该路径中个节点的值
if (0 == sum)
{
for (int i=0; i<idx; i++)
{
cout << arr[i] << " ";
}
cout << endl;
}
return;
}
else
{
checkSum(cur->left, sum, arr, idx);
checkSum(cur->right, sum, arr, idx);
}
//LB_c: 这里很关键,当前节点的子树已经遍历完,这里需要“恢复”到遍历前进行回溯!
sum += cur->v;
--idx;
}
int main()
{
//create BST
sNode n1(4);
sNode n2(8);
sNode n3(6, &n1, &n2);
sNode n4(14);
sNode root(10, &n3, &n4);
//call checkSum()
int res[MAX_LEN];
checkSum(&root, 24, res, 0);
return 0;
}
相关文章推荐
- 【算法题】打印二元查找树中元素和等于指定数的所有路径
- 设计一个算法找到数组中两个元素相加等于指定数的所有组合
- [面试题]设计一个算法找到数组中两个元素相加等于指定数的所有组合
- [面试题]设计一个算法找到数组中两个元素相加等于指定数的所有组合
- 编写文件搜索小程序:1. 输入绝对路径以及搜索关键字,2. 搜索指定路径下(包括子文件夹)中名称包含关键字的所有文件并打印出,3. 将当前操作记录日志
- 百度2014校园招聘算法——给出一组数据A=[a_0, a_1, a-2, ... a_n](其中n可变),打印出该数值元素的所有组合。
- 编写一个程序,能在当前目录以及当前目录的所有子目录下查找文件名包含指定字符串的文件,并打印出相对路径。
- 算法题: 求一个整数数组中,通过元素加减运算得到指定结果的所有运算过程. 例如【5,4,6,7,1】= 9 ?
- 每天学习一算法系列(6) (输入一个整数和一棵二元树,从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径,打印出和与输入整数相等的所有路径)
- 打印二叉树节点数值总和等于某个给定节点的所有路径
- 【代码】当前目录以及当前目录的所有子目录下查找文件名包含指定字符串的文件,并打印出绝对路径
- java实现 数组中两个元素相加等于指定数的所有组合
- Program in Lua中图算法的改进(打印所有图路径)
- Company TengX 面试 笔试 : 打印 二叉树 指定值的所有路径
- 【算法-java】打印出二叉树中结点值的和为输入整数的所有路径
- 在当前目录以及当前目录的所有子目录下查找文件名包含指定字符串的文件,并打印出相对路径
- 算法题: 求一个整数数组中,通过元素加减运算得到指定结果的所有运算过程. 例如【5,4,6,7,1】= 9 ?
- 编写一个Python程序,能在当前目录以及当前目录的所有子目录下查找文件名包含指定字符串的文件,并打印出相对路径
- 微软等数据结构+算法面试100题(21)--二叉树打印到叶子节点的所有路径
- 程序员面试金典: 9.4树与图 4.9在二叉树中,打印结点数值总和等于给定值的所有路径