C 根到叶路径之和=给定数量

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的左子级,而右子级不返回任何值?我不知道实际在哪

这个递归是如何进行的?第一次是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条件中使用它

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);