我正在编写一个 BST 库,它使用了很多递归函数,这些函数可能会修改树的根。我注意到很多程序员,甚至在 StackOverflow 上,当一个函数可能修改它时,经常返回根节点。
为什么这种做法如此分散?用双指针做同样的事情不好吗?
我在网上搜索,一无所获:/
为什么这种做法如此分散?用双指针做同样的事情不好吗?
这主要是风格和偏好的问题。
使用双指针允许函数修改根指针本身,我认为这是有利的,但这意味着您的代码必须同时处理多个间接级别,有些人认为这令人困惑或令人反感。
返回新的根允许保持单一级别的间接性,但它给改变树的函数的所有用户带来了额外的负担:他们必须用函数返回的值更新根指针。这也意味着,如果函数还想返回其他内容,那么您需要一个 out 参数,或返回类型的结构,或类似的,这失去了大部分获得的简单性。
就我个人而言,我不喜欢以上任何一种。与使用裸根指针相比,我更喜欢将根指针放入容器结构中,可能还有关于树的其他一般数据,并将指向该指针的指针传递给方法。尽管从技术上讲这仍然是两个间接级别,但它看起来和感觉更像是一个,并且它允许所涉及的函数自己更新根指针。例子,
struct node {
int data;
struct node *left,
struct node *right;
};
struct tree {
struct node *root;
// ... maybe other members ...
};
void insert(struct tree *tree, int data) {
// ... perform insertion, ultimately finishing with
tree->root = new_root;
}
当然,它使递归函数实现有点(不多)技巧,但递归对于现实世界的程序通常是一个糟糕的选择。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句