题解 | #判断是不是完全二叉树#

判断是不是完全二叉树

https://www.nowcoder.com/practice/8daa4dff9e36409abba2adbe413d6fae

/*
 * function TreeNode(x) {
 *   this.val = x;
 *   this.left = null;
 *   this.right = null;
 * }
 */
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 *
 * @param root TreeNode类
 * @return bool布尔型
 */
function isCompleteTree(root) {
    // write code here
    if (!root) {
        return false;
    }
    let isComplete = true;
    const nodeArray = [];
    const traversal = (node, level = 0) => {
        if (!nodeArray[level]) {
            nodeArray[level] = [];
        }
        nodeArray[level].push(node);
        if (node.left || node.right) {
            level++;
        }
        if (!node.left && node.right) {
            isComplete = false;
            return;
        }
        if (node.left) {
            traversal(node.left, level);
        }
        if (node.right) {
            traversal(node.right, level);
        }
    };
    traversal(root);
    for (let i = 0; i < nodeArray.length - 1; i++) {
        if (nodeArray[i].length < Math.pow(2, i)) {
            isComplete = false;
            break;
        }
    }
    if (nodeArray.length >= 2) {
        const array = nodeArray[nodeArray.length - 2];
        const length = nodeArray[nodeArray.length - 1].length;
        let count = 0;
        for (let j = 0; j < array.length; j++) {
            if (array[j].left) {
                count++;
            }
            if (array[j].right) {
                count++;
            }
            if (count < length && count < 2 * (j + 1)) {
                isComplete = false;
            }
        }
    }
    return isComplete;
}
module.exports = {
    isCompleteTree: isCompleteTree,
};

解题思路:按层序遍历,若是中间层出现某节点的左子节点不存在,而右节点存在,则不是完全二叉树。之后需要处理结尾层部分。判断如果存在次尾层的子节点不是在左侧集合,则不是完全二叉树

#判断是不是完全二叉树#
全部评论

相关推荐

牛客5655:其他公司的面试(事)吗
点赞 评论 收藏
分享
Hello_WordN:咱就是说,除了生命其他都是小事,希望面试官平安,希望各位平时也多注意安全
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务