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