一:题目描述:
给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。
完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。
二:示例与提示
示例 1:
1 2
| 输入:root = [1,2,3,4,5,6] 输出:6
|
示例 2:
示例 3:
提示:
- 树中节点的数目范围是
[0, 5 * 104]
0 <= Node.val <= 5 * 104
- 题目数据保证输入的树是 完全二叉树
三:思路
正常遍历求节点个数
使用完全二叉树特性和满二叉树节点个数计算公式
- 完全二叉树,除最后一层可以没有达到满节点,其余节点都是填满整层的
- 满二叉树节点个数为2 ^ n - 1,n为该节点的深度
- 那就先判断子树是否为满二叉树,如果是满二叉树可以直接利用公式,通过判断左外侧和右外侧的深度是否相等即可判断是否为满二叉树
- 如果不是满二叉树,返回父节点左子树的节点个数和右子树节点个数 + 1即可
四:代码
层序遍历求节点个数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
|
var countNodes = function(root) { let res = 0 if(!root) return res let queue = [root] while(queue.length){ let length = queue.length let curLevel = [] for(let i = 0; i < length; i++){ let node = queue.shift() curLevel.push(node.val) if(node.left) queue.push(node.left) if(node.right) queue.push(node.right)
} res += curLevel.length } return res };
|
完全二叉树特性
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
|
var countNodes = function(root) { if(!root) return 0 let leftDepth = 1 let rightDepth = 1 let leftNode = root.left let rightNode = root.right while(leftNode){ leftNode = leftNode.left leftDepth++ } while(rightNode){ rightNode = rightNode.right rightDepth++ } if(leftDepth === rightDepth){ return Math.pow(2, leftDepth) - 1 } let leftNumber = countNodes(root.left) let rightNumber = countNodes(root.right) return leftNumber + rightNumber + 1 };
|