这个题搞了我好久才通过,思路比较直接,就是BFS找到最后一层,然后判断是否存在NULL介于NON-NULL之间。为了思路清晰,最好能定义单独的函数来作判断,比如判断是否是最后一层,判断最后一层是否有gap。这样书写可以保证面试时思路集中在某一个具体问题上,不容易出bug, 也会给面试官留下好印象,因为这样的代码更符合设计模式的要求。

var isCompleteTree = function(root) {
    if (root === null) {
        return true;
    }
    const queue = [[root]];
    while (queue.length > 0) {
        const currLevel = queue.pop();
        const nextLevel = [];
        if (isBottom(currLevel)) {
            return !hasGap(currLevel);
        }
        if (currLevel.filter(a => a === null).length > 0) {
            return false;
        }
        for (let i = 0; i < currLevel.length; i++) {
            nextLevel.push(currLevel[i].left);
            nextLevel.push(currLevel[i].right);
        }
        queue.unshift(nextLevel);
    }
    return true;
};

function isBottom(arr) {
    for (let i = 0; i < arr.length; i++) {
        if (arr[i] !== null && (arr[i].left !== null || arr[i].right !== null)) {
            return false;
        }
    }
    return true;
}

function hasGap(arr) {
    const len = arr.length;
    let i = 0; 
    while (i < len && arr[i] !== null) {
        i++;
    }
    if (i === len) {
        return false;
    }
    let j = i;
    while (j < len && arr[j] === null) {
        j++;
    }

    if (j === len) {
        return false;
    }
    return true;
}

results matching ""

    No results matching ""