鍍金池/ 問答/人工智能  C  HTML/ js創(chuàng)建線段樹導(dǎo)致堆棧溢出怎么解?

js創(chuàng)建線段樹導(dǎo)致堆棧溢出怎么解?

使用JavaScript構(gòu)建一棵線段樹,在構(gòu)建過程中使用了遞歸,應(yīng)該是這個(gè)原因使得調(diào)用棧溢出,不知道大家還有沒有其他方法能夠解決這個(gè)問題?

代碼

class SegmentTree {
    constructor(arr, merge) {
        // 保存數(shù)組的拷貝
        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;
        }
        // 構(gòu)建子樹
        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);
        // 根據(jù)子節(jié)點(diǎn)創(chuàng)建父節(jié)點(diǎn)
        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);

錯(cuò)誤截圖

圖片描述

回答
編輯回答
巫婆

判斷條件寫的有問題吧,沒有及時(shí)停止遞歸

2018年1月13日 08:32
編輯回答
心悲涼

左右邊界中間值計(jì)算出現(xiàn)了問題,這里應(yīng)該是:

let mid = (l + (r - l) / 2) | 0;
2018年5月25日 05:46