繁体   English   中英

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

[英]How to compare root to leaf paths in a binary tree

我试图寻找所有的根到叶定红黑树内的路径。 特别是,我想编写一个测试,给定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的平衡完全不同的方法?

考虑如何制作一个采用(子)树的函数,如果平衡则(a)返回其黑色高度,否则(b)返回负数。

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

归纳案例:

  • lh是对左子树进行递归调用的结果
  • lr是在右子树上进行递归调用的结果

如果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)
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM