老师,这是我写的非递归调用,麻烦老师帮忙看看有没有什么问题呢?
来源:5-7 删除最大值,最小值
wang_liu
2017-06-02
void removeMin(Node* node)
{
while (node->left != NULL)
{
nodeBefore = node;
node = node->left;
}
Node* rightNode = node->right;
delete node;
count--;
nodeBefore->left = rightNode;
}
写回答
1回答
-
liuyubobobo
2017-06-20
抱歉,今天刚看到这里漏掉了一个问题没有回答...
整体思路非常赞!不过有一些小问题可以注意:
1)程序相当于一上来就调用 while (node->left != NULL) 这一判断,但是如果node为空,调用这一判断就会产生空指针访问的问题,所以在整个程序最开始,应该判断一下,如果node为空,直接返回NULL;
2)这个方法是应该放在类BST中的。从用户的角度,用户想要删除BST类的某个实例bst中的最小值,直接调用bst.removeMin()应该就可以了,而不需要往里面传入一个node,不然用户会很迷惑,需要传入什么node?注意,在我们的设计中,整棵树的根节点是一个私有变量。用户不应该可以直接访问整棵树的根节点。所以具体应该在这个算法中,由开发者指定从根节点开始逐渐向下搜索到合适的位置,而不需要用户的传参。注意我们课程中的递归调用版本的removeMin,用户真正可见部分的函数声明是:
void removeMin(){ if( root ) root = removeMin( root ); }
赞亲自动手主动实践的精神!
加油!
122018-07-17
相似问题