C ++如果指针指向nullptr,我可以用数字替换它吗?

时间:2017-12-05 13:56:46

标签: c++ avl-tree

嘿伙计们,我遇到了一些关于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替换高度部分的代码。 感觉很痛苦。这种情况多次发生在我的编码时间,我想找到更好的解决方案。

我的英语不太好,所以我的描述可能有点误导,如果你以任何方式帮助我,我将不胜感激。

2 个答案:

答案 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,并且不需要对算法的那一部分进行不同的处理。