当前位置: 首页 > 知识库问答 >
问题:

如何比较二叉树中的根到叶路径

岳嘉石
2023-03-14

我试图搜索给定红黑树中所有根到叶的路径。特别是,我想编写一个测试,在给定rbt的情况下,该测试将断言每个路径具有相同数量的黑色节点。

我用两个全局变量尝试这样的东西:

static int count = 0, path = -1;

int check_paths(tree_node t)
{
    if (t == NULL)
    {
        if (path == -1)
            path = count;
        else
            return (path == count);

        return 1;
    }

    if (t->black == 1) ++count;
    int x,y;
    x = check_paths(t->left);
    if (t->black == 1) --count;
    y = check_paths(t->right);

    return (x&&y);
}

然而,当左分支中的黑色节点右侧有红色节点时,我遇到了麻烦,因为这意味着计数比应该减少的更多。

有没有更好的方法来搜索根到叶的路径,计算特定值的频率,然后以某种方式比较计数?或者,如果给定rbt余额,是否有一种完全不同的方法来测试rbt余额(即,它已经制作好,但其正确性不确定)?

共有1个答案

麹正业
2023-03-14

考虑如何使函数采用(子)树,并且(a)在平衡时返回其黑色高度,或者(b)在其他情况下返回负数。

基本情况是一个空(子)树;它只返回0。

归纳情况:

  • lh是对左子树递归调用的结果

如果lh==lr并且它们是正的,则返回lh 1如果是黑色的

以下是一些未经测试的代码:

int check_paths (tree_node t)
{
    if (t == NULL)
    {
        return 0;
    }
    int lh = check_paths(t->left);
    int rh = check_paths(t->right);

    if (lh != rh || lh < 0)
    {
        return -1;
    }
    else if (t->black == 1)
    {
        return (lh + 1);
    }
    else
    {
        return (lh)
    }
}
 类似资料:
  • 问题内容: 我试图使用Java在二叉树中打印所有根到叶的路径。 在主要方法中: 但是它给出了错误的输出。 给定的树: 预期产量: [5,1,3] [5、8、6] [5、8、9] 但是输出产生了: [5,1,3] [5、1、3、8、6] [5、1、3、8、6、9] 可以找出一个… 问题答案: 用以下方法调用递归方法: 传递时会发生什么(而不是在所有方法调用中使用单个对象,这意味着,当您返回原始调用者

  • 我试图找到从根到叶的最小路径和,还需要计算最小路径。如果解决方案在左子树中,我的解决方案有效,但是如果结果在右子树中,根节点在结果路径中添加了两次,是否有人可以查看我的解决方案并帮助我修复此错误,如果有,还可以建议更好的运行时解决方案 我正在使用回溯访问所有节点,我认为我的解决方案的时间复杂度将是O(N)(因为所有节点都应该被访问,如果我错了,请纠正我)

  • 给定一棵二叉树,问题是找到所有根到叶的路径。我们通过以列表的形式传递路径,并在到达叶子时将其添加到结果中来了解算法。 我的问题是存储所有路径需要多少空间。我的直觉是,每条路径将消耗树高度(O(h))的内存顺序,如果我们的完整二叉树中有2*n-1个节点,那么每个节点对应于一条路径,因此假设树高度平衡,空间复杂度将为O(n*log(n))。我的分析正确吗?

  • 上面的函数将包含二叉树每个叶的路径的数组附加到全局数组。 代码工作正常,但我想删除全局变量,并使函数返回数组。我怎么能那样做?

  • 我必须获取二叉树中所有根到叶的路径。现在这通常是一项简单的任务,但现在我还必须识别左右节点。也就是说,当我进入节点的左子树时,该节点应记录在路径中为!abc,其中abc是节点名称。当进入右子树时,该节点应按原样记录。所以如果我的树是1(左)2(右)3,那么必须保存的两条路径是!1- 这确实获得了路径。但左右子树路径都连接在一起。也就是说,对于上面给出的示例,我得到[1,3,1,2]作为输出。我尝试

  • 假设我有一棵树: 我想要疾病的路径输出应该是这样的: 如果您转到根的右侧,它将返回True(是),如果您转到左侧,它将返回False(否) 这是我一直在尝试为此函数执行的代码,但我做错了什么,它返回的不是我想要的... 有什么办法帮我修复代码吗?谢谢 Diagnoser只是一个不重要的类,我的node类的右边是“positive\u child”,左边是“negative\u child” 如果还