我的作业涉及AVL树和等级树。
在这个特定的赋值中,我们需要实现一个Rank AVL树,它在节点中保存另一个信息。
我有这个问题:
我创建了一个AVL树,对于Rank树,我选择使用继承。
在Rank树的“Insert”函数中,我调用另一个名为“setAllHeights”的函数,它接收一个节点作为参数。
但是,当我在参数的调试器中看到值时,我看到该函数接收到NULL指针。
我不明白为什么因为在我输入“setAllHeights”函数之前,我检查了参数的值,它绝对不是NULL。
可能是什么问题,为什么会发生?
我非常感谢你的帮助。
函数Insert的代码:
template<class T, class Compare>
bool RAVL<T, Compare>::insert(const T& data) {
if (root == NULL) {
root = new (nothrow) RNode<T, Compare>(data, NULL);
if (!root)
throw AllocationError();
size++;
return true;
}
Compare cmp;
RNode<T, Compare> *v;
if (find(data, &v))
return false;
if (cmp(v->data, data)) {
v->right = new (nothrow) RNode<T, Compare>(data, v);
if (!v->right)
throw AllocationError();
} else {
v->left = new (nothrow) RNode<T, Compare>(data, v);
if (!v->left)
throw AllocationError();
}
Node<T,Compare> * n=v;
AVL<T,Compare>::setAllHeights(n);
rebalance(v);
size++;
return true;
}
setAllHeights函数的代码:
template<class T, class Compare>
void AVL<T, Compare>::setAllHeights(Node<T, Compare> *n) {
if (n == NULL) {
return;
}
setHeight(n);
setAllHeights(n->parent);
}
答案 0 :(得分:1)
在我看来,你没有初始化v,因此当你将它分配给n时,它也没有被初始化。你需要调用v = new RNode(...),或者你的逻辑。