【问题标题】:AVL / Binary Search TreeAVL/二叉搜索树
【发布时间】:2016-01-07 04:28:18
【问题描述】:

我有一个 C 编程问题。下面是使用键插入节点。

我不明白为什么node->left = insert(node->left,key)

我假设这段代码会用什么更新node->left

不是又在打电话insert()吗?就像一次又一次地调用同一个函数不是无限循环还是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);

【问题讨论】:

    标签: c algorithm binary-tree avl-tree


    【解决方案1】:

    是的,他们再次调用insert 函数,但请注意参数已更改1。这就是所谓的recursion

    还请注意,它不会总是再次调用相同的函数:如果node==NULL 它不会调用它。所以这不是无限的;当您使用node-&gt;leftnode-&gt;left-&gt;left 等时,您曾经到达指针为NULL 的点。


    1我并不是说递归调用必须总是改变它的参数,但这是最常见的方法。

    【讨论】:

    • 为什么需要调用自己存储到node->left
    • @FlyingAtom,你了解这段代码背后的算法吗?或者你一般理解二叉搜索树吗?
    • 嗯,我知道 AVL 在视觉上是如何工作的,但就代码而言,我对 C 语言有点陌生,来自 PHP 背景。
    • @FlyingAtom,这甚至与 AVL 无关;仅对于任何 BST,如果您执行插入,您将查看要插入的子树,然后您可以循环该树,或者只是递归地调用 insert()
    • AHhhh 直到它达到 NULL 并且它将调用插入节点函数。我现在明白了哈哈哈天哪,谢谢!
    猜你喜欢
    • 2013-01-18
    • 2016-11-06
    • 2016-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-21
    相关资源
    最近更新 更多