下面的代码是to find the path in a tree that adds up to a given sum
...我在这里做的是将enqueue
所有节点的值转换为数组path
并在条件满足递归时打印.... / p>
void checkSum(NODE* root, int path[], int len, int sum){
if(root == NULL) return;
path[len] = root->data;
len++;
if(sum - root->data == 0){
sum -= root->data;
cout<<"\nSum equals...";
printPaths(path, len);
}
else if(sum - root->data > 0){
sum -= root->data;
checkSum(root->left, path, len, sum);
checkSum(root->right, path, len, sum);
}else { return; }
}
我想知道的是,有没有其他方法可以在不使用任何数据结构的情况下打印路径(至少一个)???
有点喜欢这个......
void checkSum_second(NODE* root, int sum){
if(root == NULL) return;
if(sum - root->data == 0) {
//do something
}
else if(sum - root->data > 0){
sum -= root->data;
}else return;
checkSum_second(root->left, sum);
checkSum_second(root->right, sum);
cout<<"\nvalue..."<<root->data;
}
考虑像
这样的树 1
2 3
4 5 6 7
如果sum = 7
执行checkSum_second(root->left, sum);
三次,直到节点4,这里是否可以停止所有内容并打印堆栈(即清空它)....
答案 0 :(得分:3)
要尽早终止递归,您需要在调用链上传递某种信号。在您的情况下,您可以将返回类型更改为bool
,并返回true
以指示搜索已终止,并且无需进一步处理:
bool checkSum(NODE* root, int path[], int len, int sum) {
if(root == NULL) return false;
path[len] = root->data;
len++;
if (sum - root->data == 0){
sum -= root->data;
cout<<"\nSum equals...";
printPaths(path, len);
return true;
} else if (sum - root->data > 0) {
sum -= root->data;
if (checkSum(root->left, path, len, sum)) {
return true;
}
if (checkSum(root->right, path, len, sum)) {
return true;
}
}
return false;
}
请注意,在上面的代码中,递归调用仅在先前的调用继续返回false
时继续。从调用返回的第一个true
将在调用链中向上发送,从而导致整个调用链终止。
答案 1 :(得分:0)
如果您不想保存路径,在到达您的号码(7)后,向上移动图表并在途中打印每个点头。
编辑:这是关于如何执行此操作的代码 请注意,这将:
这是代码
void checkSum_second(NODE* originalRoot, NODE* root, int sum){
if(root == NULL) return;
if(sum - root->data == 0) {
//do something
NODE* tmp = root;
while (tmp != originalRoot) {
print(tmp->data);
tmp = tmp->parent;
}
}
else if(sum - root->data > 0){
sum -= root->data;
}else return;
checkSum_second(originalRoot,root->left, sum);
checkSum_second(originalRoot,root->right, sum);
cout<<"\nvalue..."<<root->data;
}
答案 2 :(得分:0)
这应该颠倒打印,但如果您不想要数据结构,我认为还有另一种方式。
找到路径后返回true
。
void checkSum_second(NODE* root, int sum){
if(root == NULL) return false;
if(sum - root->data == 0)
{
cout<<"\nvalue..."<<root->data;
return true;
}
else if(sum - root->data > 0)
sum -= root->data;
else return false;
// if first is true, second won't get evaluated (it's the way || works)
// if we found a path, print the current node and return true
if (checkSum_second(root->left, sum) ||
checkSum_second(root->right, sum))
{
cout<<"\nvalue..."<<root->data;
return true;
}
return false;
}