使用双重指针而不是单一指针

5
我正在处理一颗二叉搜索树。
以下是用于表示节点的结构体:
typedef struct TreeNode
{
int num;
struct TreeNode *left,*right;
}TREENODE;

在树中插入节点,我有以下方法签名。
void InsertNode(TREENODE **root,int data);

在上述方法中,为什么我们需要双指针?我们可以使用单指针!
我们是使用双指针来避免重复吗?

听起来很像作业... - Nick
@Nick,是的,但问题是有效的。 - Andrey
我会标记它的。 - Nick
2
@Anirudha。好的,我很高兴看到你对你的老师有疑问! - Nick
5个回答

7

不,这是在重新平衡的情况下需要的。重新平衡后,根节点可能会发生变化。

好的,我来解释一下。双指针允许您修改指针。那么在您的情况下,树的根节点是什么?是指向 TREENODE 的指针。一些操作(例如搜索)永远不会修改它。但是有些操作可能需要更改它,以便另一个节点成为新的根节点。因此,它们必须能够访问您用作根的变量。其中一个例子是重新平衡,参见 AVL trees


2
当您使用指针时,根节点始终会指向您提供的节点。但是,当通过某些平衡操作更改根节点时,您对根节点的指针也需要更改。这就是为什么您需要一个指向指针的指针。(这里的根节点不仅是输入变量,还是输出变量) - Hayt
这不一定是“重新平衡”的问题。谁说有任何重新平衡的实现呢?仅仅是因为第一次向空树中插入元素将使根节点从空指针变成非空指针。 - AnT stands with Russia
@AndreyT 这只是一个例子。所以没有任何“重新平衡实现”。 - Andrey

2
如果我们需要双重指针,那么我们需要修改它所指向的指针。

2
不,你正在使用双冒号来修改指针。

0

0

这非常取决于您如何使用树。如果树应保持某种排序方式,那么插入可能会更改根节点,因此您需要双指针。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接