最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 【一天一大 lee】完全二叉树的节点个数 (难度:中等) - Day20211124

    正文概述 掘金(前端小书童)   2020-11-24   458

    题目:

    给出一个完全二叉树,求出该树的节点个数。

    说明:

    完全二叉树的定义如下: 在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。 若最底层为第 h 层,则该层包含 1~   个节点。

    示例:

    输入:
        1
       / \
      2   3
     / \  /
    4  5 6

    输出: 6

    抛砖引玉

    在本题中按部就班的遍历二叉树是一定可以统计出所有二叉树节点的。

    广度优先遍历:

    【一天一大 lee】完全二叉树的节点个数 (难度:中等) - Day20211124
    抛砖引玉
    /**
     * 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 栏目 欢迎关注留言

    公众号:前端小书童


    起源地下载网 » 【一天一大 lee】完全二叉树的节点个数 (难度:中等) - Day20211124

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元