【问题标题】:How does this function work? (BST recursion)这个功能是如何工作的? (BST 递归)
【发布时间】:2016-07-06 14:54:23
【问题描述】:

没有找到合适的标题,请原谅我, 反正

我正在尝试分析 BST 的递归函数,它返回 1。

经过我的错误计算,我得到的返回值为 0,我想了解我在这里做错了什么。

我们从main.c调用这样的函数:func_3(root, 9);

所以 sum = 9

这是代码块:

int func_3(struct node* node, int sum)
 {
        if (node == NULL) 
              return(sum == 0);
        else 
        {
            int subSum = sum - node->data;
            return (func_3(node->left, subSum) ||  func_3(node->right, subSum));

         }
 }

这是 BST:

我的计算: func(5,9) -> func3(3,4) -> func(1,1) -> 返回 subTree = sum = 0。

【问题讨论】:

  • 请编辑问题以便正确显示缩进
  • @dear_tzvi 我不明白你的意思。
  • 可能他们的意思是:正确缩进你的代码,这样它就不会是难以阅读的混乱。
  • @Lundin 我在这里看不到任何混乱。所有内容都已正确清晰地添加到帖子中。
  • @VladfromMoscow 这个函数试图查看是否有任何路径(根到叶节点)的值之和等于sum

标签: c recursion tree binary-search-tree


【解决方案1】:

如果存在一条路径(root nodeleaf node),其值的总和等于 sum,则此函数返回 1

在 main 中的函数调用 func_3(root, 9) 中,您要做的是检查二叉树中是否有任何路径,使得该路径中所有节点的值之和等于 9。

有这样的路径,就是最左边的路径(5->3->1),所以你的函数会返回1。

这是它返回 1 的方式。第一次调用是

func_3(node, 9)

其中node 指向这棵树的根节点,即值为5 的根节点。

这里的节点不为空。所以,

subSum = 9 - 5 = 4。

下一个电话是

func3(node, 4)

其中node 指向值为3 的节点(先前调用的节点的左子节点)

这里节点又不是空的,所以,

subSum = 4 - 3 = 1

下一个电话是

func3(node, 1)

其中node 指向值为1 的节点(上一次调用的节点的左子节点)

这里节点又不是空的,所以,

subSum = 1 - 1 = 0

下一个电话是

func_3(node, 0)

其中node 指向NULL(前一个调用节点的左子节点)

然而这次nodeNULL,由于sum == 0为真,所以会返回1,并且这个返回值一直向上递归返回,最后返回到main

【讨论】:

  • 非常感谢sps!
  • 厕所。另外,还有一点需要注意。您在问题末尾给出的推理(返回值为 0)表明您对这个函数何时可以返回 0 感到困惑。对于这个返回 0 的函数,它应该遍历 each and every 路径。那是因为你有return func_3(node->left, subSum) || func_3(node->right, subSum),所以你可以看到,如果1没有从func_3(node->left, subSum)返回,那么func_3(node->right, subSum)被调用了。因此,您会看到要返回的 0 every 路径被遍历。
  • 很好的解释!我现在更明白了。谢谢sps
猜你喜欢
  • 2013-03-20
  • 2017-07-12
  • 1970-01-01
  • 2015-11-25
  • 1970-01-01
  • 2016-11-01
  • 2019-01-30
  • 1970-01-01
  • 2017-07-29
相关资源
最近更新 更多