嘿伙计们,我遇到了一些关于C ++的问题。实际上这不是语言特征的问题,否则它与编码风格有关 好的,让我们明白一点! 我尝试编写AVL树并想要计算平衡因子, 并根据规则,没有节点的子树(只是一个空树), 其高度应视为 -1 。是的,一切都很好, 但是当我编写代码时,使用指针来读取 Node 类成员, 我无法读取nullptr BAD ACCESS ,所以我添加了很多条件,这使我的代码看起来很糟糕。这是我的代码的一些部分。
struct Node{
int key;
int height;
Node* left;
Node* right;
Node* parent;
Node(void);
Node(int key);
};
while((parent_node->left->height - parent_node->right->height) <= 1
||(parent_node->left->height - parent_node->right->height) >= (-1))
{
parent_node = parent_node->parent;
if(parent_node == nullptr) break;
}
我想要的结果是当parent_node的左子树为空时,
它的高度将被视为-1。事实是,虽然它是空的,但它的高度不应该存在。
所以在代码中我只列出了四个案例
1. left subtree == nullptr&amp;&amp;右子树== nullptr
2. left subtree!= nullptr&amp;&amp;右子树== nullptr
3. left subtree!= nullptr&amp;&amp;右子树!= nullptr
4. left subtree == nullptr&amp;&amp;右子树!= nullptr
然后我分别用值-1替换高度部分的代码。
感觉很痛苦。这种情况多次发生在我的编码时间,我想找到更好的解决方案。
我的英语不太好,所以我的描述可能有点误导,如果你以任何方式帮助我,我将不胜感激。
答案 0 :(得分:3)
创建一个计算子树高度的函数,包括特殊情况,并使用它而不是访问->height
数据成员:
int heightOfSubtree(Node* tree) {
if (tree == nullptr) {
return -1;
}
else {
return tree-> height;
}
}
然后您的代码变为:
while((heightOfSubtree(parent_node->left) - heightOfSubtree(parent_node->right)) <= 1
||((heightOfSubtree(parent_node->left) - heightOfSubtree(parent_node->right)) >= (-1))
{
...
}
或更好,您可以在Node
结构中定义成员函数,例如:
bool Node::isBalanced() {
int unb = heightOfSubtree(left) - heightOfSubtree(right);
return (unb <= 1) || (unb >=-1);
}
并且您的while
条件变为:
while(parent_node->isBalanced()) {
...
}
ps:我相信你的代码中存在逻辑错误:我不确定你检查的条件是否正确,因为它总是正确的(任何数字都大于-1或小于1,对于某些是真的)
答案 1 :(得分:1)
除非我误解,否则你可以指向一个前哨节点而不是null作为终结者链接。将标记的高度设置为-1,并且不需要对算法的那一部分进行不同的处理。