Algorithm 从树中删除所有蓝色节点

Algorithm 从树中删除所有蓝色节点,algorithm,binary-tree,Algorithm,Binary Tree,给定一个具有颜色属性的节点的二叉树。树有红色节点和蓝色节点 是否从树中删除所有蓝色节点并返回仅包含红色节点的树 我尝试过这样实施: Node stripblue(Node root) { if(root.left != NULL) root.left = stripblue(root.left) //is this line correct ? //TODO if(root.right != NULL) root.right = stripblue(r

给定一个具有颜色属性的节点的二叉树。树有红色节点和蓝色节点

是否从树中删除所有蓝色节点并返回仅包含红色节点的树

我尝试过这样实施:

Node stripblue(Node root)
{
    if(root.left != NULL)
      root.left = stripblue(root.left) //is this line correct ? //TODO

    if(root.right != NULL)
       root.right = stripblue(root.right) // is this line correct ? //TODO

     if(root.color == RED)
     return root
}

我在实现算法的
TODO
部分时遇到了一些麻烦。有人能给我一些想法吗?

如果删除前后的遍历顺序没有限制,我会写一个,看起来像是删除一个普通二叉树的节点

Node stripblue(Node root)
{
    if(root == NULL)
        return NULL;
    if(root.color == BLUE)
    {
        Node next_r;
        next_r = search_red(root.left);
        if(next_r == NULL)
            next_r = search_red(root.right);
                if(next_r == NULL)
                    return NULL;
                    //no node is RED

            //TODO:swap the content of next_r and root
            next_r.color = BLUE;
            root.color = RED;
    }
    root.left  = stripblue(root.left);
    root.right = stripblue(root.right);
    return root;
}

search_red(Node root)
是一个查找根下第一个红色节点的函数。如果您希望在前序遍历前后保持红色节点的顺序相同,则
search_red(Node root)
是查找左个子节点前序中的第一个节点,或者右子节点的第一个节点。

那么您最终使用自上而下的就地交换返回一个子树?酷,我在退一个新的tree@user1701868(一种复杂的方式,仅供参考)如果您想要一个新的树,您可以执行只记录红色节点的前序遍历和按序遍历。通过这两个序列,您可以仅用红色节点重新构建新树。@user1701868如果原始树的所有节点均为红色且深度至少为3,则函数将删除诸如root、root.right、root.left、root.left.left等节点。我不认为它是一个很好的解决方案,可以移除所有的蓝色节点,因为它同时删除大量的红色节点。考虑到这个例子,我的节点有一个红色的左叶,然后很明显地,它只返回红叶并终止。我犯了一个错误,你能修改我的算法使它工作吗?我只是想把它作为我的生日礼物understanding@user1701868它是关于限制和实现的。最大的问题是当根是蓝色时,如何处理它。您可以根据需要更改
search\u red(Node root)
的实现。因此,我认为我的解决方案只是代码框架的实现之一。