js创建线段树导致堆栈溢出怎么解?
使用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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
判断条件写的有问题吧,没有及时停止递归
左右边界中间值计算出现了问题,这里应该是: