我有一个函数,它接受一个结构
的指针node *found = nbitree.findnode(nbitree.base_node, 15);
' nbitree.base_node'是什么成为0x0指针。我有一种感觉我没有正确处理这个指针,但我不知道如何解决它。
nbitree.base_node的创建如下:
struct node {
int load;
node *parent{0};
node *left{0};
node *right{0};
};
//...in the Bitree class
base_node = new node;
将函数声明为
node *Bitree::findnode(node *nd, int value){
if (nd->load == value){
return nd;
} else if (findnode(nd->left, value) != 0){
return findnode(nd->left, value);
} else if (findnode(nd->right, value) != 0){
return findnode(nd->right, value);
}
return 0;
}
我调试了代码并填充了base_node并保存了一个有效的指针,但每当我尝试复制它或传递它时,我得到一个空指针。此代码编译时没有任何错误或警告。
答案 0 :(得分:2)
我注意到的一件事:这段代码:
node *Bitree::findnode(node *nd, int value){
if (nd->load == value){
return nd;
} else if (findnode(nd->left, value) != 0){
return findnode(nd->left, value);
} else if (findnode(nd->right, value) != 0){
return findnode(nd->right, value);
}
return 0;
}
有冗余函数调用。您重新运行找到该节点的树分支中的查找。更好的方法是跟踪结果,这样您只需在子树上调用findnode
一次:
node *Bitree::findnode(node *nd, int value){
if (nd->load == value) return nd;
node* f = findnode(nd->left, value);
if(f) return f;
return findnode(nd->right, value);
}
当然,如果您的节点值按树排序存储,就像在大多数二叉树中一样,您不需要尝试两个分支,并且实际上会获得O(logN)性能:
node *Bitree::findnode(node *nd, int value) {
while(nd) {
if(nd->load == value) return nd;
if(nd->load < value) nd = nd->left;
else nd = nd->right;
}
return 0;
}