【发布时间】:2021-03-02 22:33:25
【问题描述】:
我目前正在用 C++ 实现红黑树。我遇到的一个问题是,最初,我的 Node 类的构造函数会像这样初始化每个 Node 对象:
(Node类属性)
Tree_node *left;
Tree_node *right;
Tree_node *parent;
static Tree_node *node_to_delete;
static Tree_node *successor;
static bool is_balanced_tree;
static int black_depth_count;
int val;
int color;
int visited;
int visited_deletion;
};
(节点类构造函数)
Tree_node::Tree_node(int v){
val=v;
left=NULL;
right=NULL;
parent=NULL;
color=1;
visited=0;
visited_deletion=0;
}
当然,我最终意识到,默认情况下将左/右子节点实例化为 NULL 会导致我的树没有真正的黑色外部节点,而是简单的 null 值。这会导致删除情况下的问题,其中替换我们原始节点的节点的右子节点是外部节点(因此在我的代码中被认为是简单的 NULL),因此我无法访问任何类方法来返回我们的父节点当前节点或兄弟节点,因为节点本身甚至不是节点,它只是 NULL。
所以我现在要做的是构建一个子类 Nil_Black_Node,它将是树的外部节点,而不仅仅是一个 NULL 值。不同之处在于,此构造函数默认将节点的颜色初始化为 0(黑色)而不是像 Tree_node 非外部节点的构造函数那样的 1(红色)。我的 Nil Black Node 是这样声明的(它是 Tree_node 类的子类)
class Nil_Black_Node:public Tree_node{
public:
Nil_Black_Node();
};
它的构造函数只是将它的颜色值设置为0:
Nil_Black_Node::Nil_Black_Node():Tree_node(0){
color=0;
}
但现在的问题是我的 Nil Black 节点被初始化为值为 0。我不希望我的 Nil Black 节点具有任何值——在这些外部节点的上下文中真正重要的是它们具有指向它们是子节点的 Tree_node 的父指针,颜色为 0。允许它们具有值会弄乱我的插入方法,因为我的方法将遍历树并看到 nil 黑色节点的值为 0 并尝试插入节点作为它的子节点,就像它是任何其他节点一样。有没有办法绕过它们有任何价值?像某种空占位符?
【问题讨论】:
标签: c++ algorithm class inheritance