我有一个C编程问题。以下是带有密钥的节点的插入。
我不明白为什么node->left = insert(node->left,key)
我假设这段代码会用什么来更新node->left
?
不是再次呼叫insert()
吗?就像再次调用同一个函数一样,它不是一个无限循环或插入调用吗?
我查了几个例子,他们都是通过再次调用同一个函数来更新node->left
的方法吗?让我们说我误解了,它里面有什么存储?指针?或者他们只是神奇地联系在一起?
// An AVL tree node
struct node
{
int key;
struct node *left;
struct node *right;
int height;
};
struct node* insert(struct node* node, int key)
{
/* 1. Perform the normal BST rotation */
if (node == NULL)
return(newNode(key));
if (key < node->key)
node->left = insert(node->left, key);//This just called Insert function again?
else
node->right = insert(node->right, key);
答案 0 :(得分:4)
是的,他们再次调用insert
函数,但请注意参数已更改 1 。这就是所谓的recursion。
另请注意,总是再次调用相同的函数:如果node==NULL
它没有调用它。所以这不是无限的;当您执行node->left
,node->left->left
等操作时,您曾到达指针为NULL
的点。
1 我不是说递归调用必须总是改变其论点,但这是最常用的方法。