从树中删除所有蓝色节点

时间:2013-08-27 01:54:22

标签: 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(root.right) // is this line correct ? //TODO

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

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

1 个答案:

答案 0 :(得分:0)

如果在删除之前和之后没有对遍历顺序的限制,我会写一个,这看起来像删除了一个公共二叉树的节点。

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)是查找根目录下第一个RED节点的函数。如果你想在前序遍历之前和之后保持RED节点的顺序相同,你的search_red(Node root)就是找到的左子的预先排序的第一个节点,或右子的第一个节点。