【问题标题】:How to compare root to leaf paths in a binary tree如何比较二叉树中的根路径和叶路径
【发布时间】:2012-09-22 18:34:46
【问题描述】:

我正在尝试搜索给定红黑树中的所有从根到叶的路径。特别是,我想写一个测试,给定一个 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 的余额(即它已经制成但其正确性不确定)?

【问题讨论】:

    标签: c recursion tree binary-tree


    【解决方案1】:

    考虑如何制作一个函数,该函数采用(子)树,并且 (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)
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-29
      • 2022-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-03
      • 2014-02-05
      • 1970-01-01
      相关资源
      最近更新 更多