这种递归是如何进行的?这是第一次,它将是14-10 = 4和 如果(node-> left)条件满足如此函数,则node-> left(节点8)和sum值(4)被调用,但是节点中的or条件的使用是什么?&left; left和node- >正确?
假设给定的总和是21然后我们最后递归到节点3并且在节点 - >左边的函数中调用sum = 3,则返回1作为sum = 0并且没有子节点但是返回的是1回到节点8,之后我们去节点5吗?
如果我们确实节点5没有返回任何值,那么它如何计算返回1的左子节点并且它的右子节点没有返回任何值?我没有看到实际使用或条件的位置,为什么有必要在node-> left和node-> right条件下使用它?
int main()
{
int sum=14; //sum=21;
struct node *root = newnode(10);
root->left = newnode(8);
root->right = newnode(2);
root->left->left = newnode(3);
root->left->right = newnode(5);
root->right->left = newnode(2);
if(hasPathSum(root, sum))
printf("There is a root-to-leaf path with sum %d", sum);
else
printf("There is no root-to-leaf path with sum %d", sum);
getchar();
return 0;
}
bool hasPathSum(struct node* node, int sum)
{
/* return true if we run out of tree and sum==0 */
if (node == NULL)
{
return (sum == 0);
}
else
{
bool ans = 0;
int subSum = sum - node->data;
if ( subSum == 0 && node->left == NULL && node->right == NULL )
return 1;
if(node->left)
ans = ans || hasPathSum(node->left, subSum);
if(node->right)
ans = ans || hasPathSum(node->right, subSum);
return ans;
}
}
答案 0 :(得分:1)
在:
if(node->left)
ans = ans || hasPathSum(node->left, subSum);
if(node->right)
ans = ans || hasPathSum(node->right, subSum);
第一个" ans = ans || ..."没有函数因为ans是假的。在第二个if中,ans可以通过第一个if设置为true,然后不会调用hasPathSum。但是,它具有良好的正交外观和易于阅读的代码
答案 1 :(得分:1)
请参阅http://en.wikipedia.org/wiki/Short-circuit_evaluation以获取有关||内容的详细说明操作
答案 2 :(得分:0)
您可以使用
if (root->left)
ans = hasPathSum(root->left, subSum);
if (root->right && ans == false)
ans = hasPathSum(root->right, subSum);
相反,也是正确的。
正如Paul所说的,如果可以通过第一个条件将ans设置为true,则不再需要第二个条件和对递归方法的调用,因为已经找到了总和等于给定参数的路径。 / p>
答案 3 :(得分:-1)
void path(Node *root,int arr[],int end){
if(root==NULL)return;
arr[end++]= root->data;
if(root->left ==NULL && root->right==NULL){
for(int i = 0;i<end;i++){
cout<<arr[i]<<" ";
}
cout<<"#";
}
else{
if(root->left)path(root->left,arr,end);
if(root->right)path(root->right,arr,end);
}
}
void printPaths(Node* root)
{
int pathArr[1000];
path(root,pathArr,0);
cout<<endl;
}