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)
的实现。因此,我认为我的解决方案只是代码框架的实现之一。