根到叶子路径总和=给定数量

时间:2015-02-13 07:40:52

标签: c binary-tree

这种递归是如何进行的?这是第一次,它将是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;
    }
}

4 个答案:

答案 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;
}