js创建线段树导致堆栈溢出怎么解?

发布于 2022-09-07 21:08:09 字数 1227 浏览 14 评论 0

使用JavaScript构建一棵线段树,在构建过程中使用了递归,应该是这个原因使得调用栈溢出,不知道大家还有没有其他方法能够解决这个问题?

代码

class SegmentTree {
    constructor(arr, merge) {
        // 保存数组的拷贝
        this.data = arr.slice();
        this.tree = [];
        this.merge = merge;
        this._buildSegmentTree(0, 0, this.data.length - 1);
    }

    _buildSegmentTree(treeIndex, l, r) {
        // 递归退出条件
        if (l === r) {
            this.tree[treeIndex] = this.data[l];
            return;
        }
        // 构建子树
        let leftTreeIndex = this.leftChild(treeIndex);
        let rightTreeIndex = this.rightCild(treeIndex);
        let mid = (l + (l + r) / 2) | 0;
        this._buildSegmentTree(leftTreeIndex, l, mid);
        this._buildSegmentTree(rightTreeIndex, mid + 1, r);
        // 根据子节点创建父节点
        this.tree[treeIndex] = this.merge(this.tree[leftTreeIndex], this.tree[rightTreeIndex]);
    }

    leftChild(index) {
        return index * 2 + 1;
    }
    rightCild(index) {
        return index * 2 + 2;
    }
}


let arr = [1, 2, 3];
let segTree = new SegmentTree(arr, (a, b) => a + b);
console.log(segTree.tree);

错误截图

图片描述

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

罗罗贝儿 2022-09-14 21:08:09

判断条件写的有问题吧,没有及时停止递归

情徒 2022-09-14 21:08:09

左右边界中间值计算出现了问题,这里应该是:

let mid = (l + (r - l) / 2) | 0;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文