这个功能是如何工作的? (BST 递归)
How does this function work? (BST recursion)
没有找到合适的标题,请见谅,
反正
我正在尝试分析 BST 的递归函数,returns 1.
经过我的错误计算,我得到 return 值为 0,我想知道我在这里做错了什么。
我们从 main.c
调用函数:func_3(root, 9);
所以总和=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) -> returns subTree = sum = 0.
此函数 returns 1
如果有一条路径(root node
到 leaf node
),其值的总和等于 sum
。
在 main 中的函数调用 func_3(root, 9)
中,您试图做的是检查二叉树中是否有任何路径,以便该路径中所有节点的值之和相等到 9。
有这样一条路径,就是最左边的路径(5->3->1),所以你的函数会return 1.
这是 returning 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
(上次调用节点的左子节点)
不过这次node
是NULL
,既然sum == 0
是真的,那么就会return1
,而这个return值在递归中一直 returned,最后到达 main
.
没有找到合适的标题,请见谅, 反正
我正在尝试分析 BST 的递归函数,returns 1.
经过我的错误计算,我得到 return 值为 0,我想知道我在这里做错了什么。
我们从 main.c
调用函数:func_3(root, 9);
所以总和=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) -> returns subTree = sum = 0.
此函数 returns 1
如果有一条路径(root node
到 leaf node
),其值的总和等于 sum
。
在 main 中的函数调用 func_3(root, 9)
中,您试图做的是检查二叉树中是否有任何路径,以便该路径中所有节点的值之和相等到 9。
有这样一条路径,就是最左边的路径(5->3->1),所以你的函数会return 1.
这是 returning 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
(上次调用节点的左子节点)
不过这次node
是NULL
,既然sum == 0
是真的,那么就会return1
,而这个return值在递归中一直 returned,最后到达 main
.