给定具有颜色属性的节点的二叉树。树有红色节点和蓝色节点。
从树中删除所有蓝色节点并返回仅包含红色节点的树?
我试图像这样实现:
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
部分时遇到了一些麻烦。有人可以给我一些想法吗?
答案 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)
就是找到的左子的预先排序的第一个节点,或右子的第一个节点。