• 【力扣】222. 完全二叉树的节点个数


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

    说明:

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

    示例:

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

    输出: 6


    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/count-complete-tree-nodes
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    使用递归:

    时间复杂度、空间复杂度都O(n)

    class Solution {
    
        int number = 0;
        public int countNodes(TreeNode root) {
            if(root == null){
                return number;
            }
            dfs(root);
            return number;
        }
    
        public void dfs(TreeNode root){
            if(root == null){
                return;
            }
            number++;
            dfs(root.left);
            dfs(root.right);
        }
    }

    但并没有使用完全二叉树的特点

    public int countNodes(TreeNode root) {
            
    
            //如何利用完全二叉树的特点
    
            //首先算出来当前二叉树的高度
            int tree = treeHeight(root);
    
            if(tree == 0 || tree == 1){
                //如果树的高度是 0 或者1 则直接返回
                return tree;
            }
    
            //再计算出右子树的高度
            int rightTree = treeHeight(root.right);
    
            //如果右子树的高度和整个树的高度 -2 相等,那么说明,这棵树的右子树为满二叉树
            if(rightTree == tree - 2){
                //那么这个二叉树的右子树的节点个数就是固定的
                //那么只需要关心左子树的节点的个数了
                return (1 << rightTree) + countNodes(root.left);
            } else {
                //如果右子树的个数是 整个树的高度 -1 相等,那么说明,这个树的左子树是满二叉树
                //那么就只需要关心右子树的节点的个数了
                return (1 << (tree - 1)) + countNodes(root.right);
            }
        }

    参考:https://leetcode-cn.com/problems/count-complete-tree-nodes/solution/javadai-ma-tu-wen-xiang-jie-ji-bai-liao-100de-yong/

    一个入行不久的Java开发,越学习越感觉知识太多,自身了解太少,只能不断追寻
  • 相关阅读:
    centos中pipelinedb安装及初步使用
    sqlalchemy 的操作
    存储引擎,索引,慢日志,权限管理
    python使用mysql
    mysql数据库查找数据的方法。
    mysql 数据库的基本操作
    epoll 数据库安装以及相关概念
    IO模型,非阻塞IO模型,select实现多路复用
    线程回调,线程中的队列,事件,greenlet模块,gevent模块,自定义补丁, 单线程实现并发,协程
    GIL全局解释器锁,线程池与进程池 同步异步,阻塞与非阻塞,异步回调
  • 原文地址:https://www.cnblogs.com/fengtingxin/p/14034701.html
Copyright © 2020-2023  润新知