C 根到叶路径之和=给定数量
这个递归是如何进行的?第一次是14-10=4,并且 如果(node->left)条件满足so函数,则调用node->left(node 8)和sum值(4),但node->left和node->right中的or条件有什么用途 假设给定的和是21,那么在我们递归到节点3之后,在node->left函数中调用sum=3,1返回为sum=0,没有子节点,但1返回到哪里是节点8,然后我们转到节点5 如果我们这样做,节点5不返回任何值,那么它如何计算返回1的左子级,而右子级不返回任何值?我不知道实际在哪里使用了or条件,为什么需要在node->left和node->right if条件中使用它C 根到叶路径之和=给定数量,c,binary-tree,C,Binary Tree,这个递归是如何进行的?第一次是14-10=4,并且 如果(node->left)条件满足so函数,则调用node->left(node 8)和sum值(4),但node->left和node->right中的or条件有什么用途 假设给定的和是21,那么在我们递归到节点3之后,在node->left函数中调用sum=3,1返回为sum=0,没有子节点,但1返回到哪里是节点8,然后我们转到节点5 如果我们这样做,节点5不返回任何值,那么它如何计算返回1的左子级,而右子级不返回任何值?我不知道实际在哪
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;
}
}
在:
第一个“ans=ans | | |……”没有任何功能,因为ans为false。在第二个if中,第一个if可以将ans设置为true,然后不会调用hasPathSum。但是,它有助于生成外观良好且易于阅读的代码有关| |运算符中发生的情况的详细说明,请参见。无效路径(节点*根,int arr[],int end){
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;
}
if(root==NULL)返回;
arr[end++]=根->数据;
if(root->left==NULL&&root->right==NULL){
对于(int i=0;i您可以使用
if (root->left)
ans = hasPathSum(root->left, subSum);
if (root->right && ans == false)
ans = hasPathSum(root->right, subSum);
相反,这也是正确的
正如Paul所说,如果ans可以通过第一个条件设置为true,那么第二个条件和对递归方法的调用就不再必要了,因为已经找到了求和等于给定参数的路径
if (root->left)
ans = hasPathSum(root->left, subSum);
if (root->right && ans == false)
ans = hasPathSum(root->right, subSum);