堆栈溢出?非常深的递归期间的有趣行为

Stack overflow? Interesting behaviour during very deep recursion

当我在 BST、Linked Lists 和 AVL 上做作业时,我注意到..实际上它如标题所示。

我相信它与堆栈溢出有某种关系,但找不到它发生的原因。

创建 BST 和链表

正在搜索链表和 BST 中的所有元素

可能是最有趣的...

BST与AVL的高度对比

(基于唯一随机整数数组)

在每张图上,一些有趣的事情从大约 33k 个元素开始。

MS 中的优化 O2 Visual Studio 2019 社区。

链表的查找功能不是递归的。

每个 "link" 的内存是用 "new" 运算符分配的。

X 轴在 40k 元素处结束,因为当它大约为 43k 时会发生堆栈溢出错误。

你知道为什么会这样吗?实际上,我很好奇发生了什么。期待您的回答!保持健康。

这是一些相关的代码,虽然不完全相同,但我可以保证它的工作原理是一样的,可以说一些代码是基于它的。

struct tree {
        tree() {
        info = NULL;
        left = NULL;
        right = NULL;
        }
        int info;
    struct tree *left;
    struct tree *right;
};

struct tree *insert(struct tree*& root, int x) {
    if(!root) {
        root= new tree;
        root->info = x;
        root->left = NULL;
        root->right = NULL;
        return(root);
    }
    if(root->info > x)
         root->left = insert(root->left,x); else {
        if(root->info < x)
            root->right = insert(root->right,x);
    }
    return(root);
}

struct tree *search(struct tree*& root, int x) {
    struct tree *ptr;
    ptr=root;
    while(ptr) {
        if(x>ptr->info)
             ptr=ptr->right; else if(x<ptr->info)
             ptr=ptr->left; else
             return ptr;
    }

int bstHeight(tree*& tr) {
    if (tr == NULL) {
        return -1;
    }
    int lefth = bstHeight(tr->left);
    int righth = bstHeight(tr->right);

    if (lefth > righth) {
        return lefth + 1;
    } else {
        return righth + 1;
    }
}

AVL树是按顺序读取的BST,然后通过二分法将元素数组插入到树object中。

时间可能会出现峰值,我几乎可以肯定它们是,因为用完了 CPU(例如 L2)的一些缓存。一些剩余数据存储在较慢的内存中。

回答感谢@David_Schwartz

BST树的高度飙升实际上是我自己的错。对于 "array of unique random" 整数,我使用了已经排序的唯一项目的数组,然后通过使用 rand() 函数交换元素将它们混合起来。我完全忘记了如果期望随机更大的数字会有多大的破坏性。

感谢@rici 指出。