题目:
给出一个完全二叉树,求出该树的节点个数。
说明:
完全二叉树的定义如下: 在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。 若最底层为第 h 层,则该层包含 1~ 个节点。
示例:
输入:
1
/ \
2 3
/ \ /
4 5 6
输出: 6
抛砖引玉
在本题中按部就班的遍历二叉树是一定可以统计出所有二叉树节点的。
广度优先遍历:
/**
* Definition for a binary tree node.
* function TreeNode(val) {
* this.val = val;
* this.left = this.right = null;
* }
*/
/**
* @param {TreeNode} root
* @return {number}
*/
var countNodes = function(root) {
if (root == null) return 0
let queue = [root],
_result = 1
while (queue.length) {
let node = queue.pop()
if (node.left) {
queue.push(node.left)
_result++
}
if (node.right) {
queue.push(node.right)
_result++
}
}
return _result
}
递归
遍历二叉树还有深度优先遍历的递归方案,鉴于本题要求传入二叉树返回二叉树节点数,则可以直接实现统计二叉树节点的递归逻辑:
传入二叉子树 如果子树为空节点数为 0 如果子树存在左子树或右子树则节点数+1,继续递归求左子树节点数和右子树节点数
var countNodes = function(root) {
if (root == null) return 0
return 1 + countNodes(root.left) + countNodes(root.right)
}
单独统计底层节点数
根据题目完全二叉树定义,知道二叉树的层级,那么除了最后一层二叉树的节点数其实是确定的,那么这个问题就可以看出两个部分:
前 level-1 层数量,数学问题:1+2+4...+n+2n = 2**(level-1) - 1 第 level 逐个遍历统计
var countNodes = function(root) {
if (!root) return 0
let count = { level: 1, done: false },
level = 1,
_result = 0,
node = root
while (node.left || node.right) {
level++
node = node.left || node.right
}
// 前 level-1 层数量(注意:如果level-1最小为1)
_result = 2 ** (level - 1 || 1) - 1
// 第 level 逐个遍历统计
get_end_num(root, 1)
// (root,层数)
function get_end_num(node, itemLevel) {
if (itemLevel + 1 === level) {
if (node.right) _result++
if (node.left) _result++
} else {
if (node.left) get_end_num(node.left, itemLevel + 1)
if (node.right) get_end_num(node.right, itemLevel + 1)
}
}
return _result
}
博客: 前端小书童
每天的每日一题,写的题解会同步更新到公众号一天一大 lee 栏目 欢迎关注留言
公众号:前端小书童
常见问题FAQ
- 免费下载或者VIP会员专享资源能否直接商用?
- 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
- 提示下载完但解压或打开不了?
- 找不到素材资源介绍文章里的示例图片?
- 模板不会安装或需要功能定制以及二次开发?
发表评论
还没有评论,快来抢沙发吧!