您的位置:首页 > 其它

【算法题】打印二元查找树中元素和等于指定数的所有路径

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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐