【问题标题】:find a path to leaf equal to sum (not BST)找到等于总和的叶子路径(不是 BST)
【发布时间】:2013-05-26 12:41:58
【问题描述】:

我正在尝试在 C 中编写一个递归函数,它接收二叉树中的根,并检查是否存在等于给定总和的 pathtoleaf。例如,它接收以下树中的第一个节点:

          1

   2              3

5       10       4    20

                            2

以下是 PathToLeaf 的示例:

  • 1⟶2⟶10
  • 2⟶5
  • 20⟶2

以下不是PathToLeaf:

  • 1⟶2
  • 1⟶3⟶20

如果路径存在,函数应该返回 1;如果不是,它应该返回 0。

在这棵树中,如果 sum=12,那么函数应该返回 1,因为路径是 2⟶10;如果 sum=4,那么函数应该返回 0,因为唯一的路径 (1⟶3) 不会以叶子结尾。

我最大的问题是我只能管理一个检查根叶路径的函数。

【问题讨论】:

  • 管理一组总和,而不是单个总和。当您访问一个节点时,(1) 将 0 插入到当前集合中,(2) 将节点的值添加(如算术)到集合的所有元素中。使用新集合访问节点的子节点。

标签: c binary-tree


【解决方案1】:

如果你有一个函数roottoleaf(const BST *tree, int target),你的pathtoleaf(const BST *tree, int target) 函数很容易遵循,不是吗,使用适当的树遍历?

int pathtoleaf(const BST *tree, int target)
{
    if (tree == NULL)
        return 0;
    else if (roottoleaf(tree, target))
        return 1;
    else if (pathtoleaf(tree->left, target))
        return 1;
    else if (pathtoleaf(tree->right, target))
        return 1;
    else
        return 0;
}

2021-07-04:更新以涵盖 tree 为 NULL 的情况。

【讨论】:

  • 我需要它作为递归函数,我们没有在 BST 上工作,树是未排序的
  • 称它为 ST 而不是 BST,或者 B 代表 Binary 而不是 Balanced。它是一种数据类型;它的名字无关紧要。我唯一明确假设的是它包含成员leftright,它们指向树的下一层;绝对没有关于排序或平衡的假设(只是树是二元的;一个节点最多有两个孩子)。你可以通过展示你得到的东西来帮助你。我已经为您解决了它缺乏递归性的问题(也修复了一个错误!);它需要为子树调用自己。
  • 代码现已测试;它适用于我的 roottoleaf() 函数,这是我实现中的 14 行代码(包括定义行、打开和关闭大括号)。
  • 代码不错,但我需要一个不使用任何外部函数或外部参数的函数。这是我的想法:int isExistsPathToLeafForGivenSum(Tree * t, int sum){ if(!t) return 0; if(t->left==NULL && t->right==NULL && t->value==sum) return 1; if(isExistsPathToLeafForGivenSum(t->left, sum)==1) return 1; else if(isExistsPathToLeafForGivenSum(t->right, sum)==1) return 1; else if(isExistsPathToLeafForGivenSum(t->left, sum-t->value)==1) return 1; else if(isExistsPathToLeafForGivenSum(t->right, sum-t->value)==1) return 1; else return 0;
  • 看起来应该这样做——我还没有测试过你的代码。如果您对解决方案有人为限制(例如“只有一个功能”),请在您的问题中说明它们。在课堂之外,没有那种约束;你可以在你认为合适的时候引入函数。在教室里,他们希望你按照他们的方式做事(不仅仅是一种行之有效的方式)。如果您不告诉我们人为约束,我们将不会给出符合人为约束的答案。
猜你喜欢
  • 1970-01-01
  • 2022-11-04
  • 1970-01-01
  • 2016-08-03
  • 2019-10-17
  • 1970-01-01
  • 2020-01-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多