【leetcode】每日精选题详解之222. 完全二叉树的节点个数

        嗨,大家好,我是袁厨(因为酷爱做饭,所以自己考取了厨师证)。之前一直看大家写的博客,学到了很多东西。然后最近萌生了自己写的想法,将自己知道的分享给需要的同学。以后每天会为大家分享leetcode精选题目的各种题解和Python, JS, JQ, CSS, PHP, JAVA的一些小Demo。请大家关注我,一起交流学习吧。


题目描述

在这里插入图片描述


递归解法

做题思路

看到这个题目的第一想法是用递归,这个题目和求最大深度是一样的,只不过最大深度是返回其中的最大值,我们这个题目是返回和。上篇文章提到的递归三部曲,我们将该题往三部曲上面靠。进而求出节点数量,而且我们使用递归时,不需要考虑太多层,这样会让你的脑袋死机,你的脑子才能装几层呀,我们只需要考虑好眼前的层数,然后调用递归即可。

题目代码

class Solution {
    
    
    public int countNodes(TreeNode root) {
    
    
          return  nodeNum(root);           
    }
    //确定递归函数的参数和返回值
    public int nodeNum(TreeNode root){
    
    
       //确定终止条件
        if(root == null){
    
    
            return 0;
        }
        //确定单层条件
        int leftnum = nodeNum(root.left);
        int rightnum = nodeNum(root.right);
        //这里和最大深数是不一样的,我们需要返回的是节点和,
        //left代表的是左子树的节点个数,right代表的是右子树个数,
        //你可以只考虑前两层进行思考,这样比较容易相通
        return leftnum+rightnum+1
    }
}

        


迭代法(BFS)

做题思路

用迭代来做比较容易理解,但是消耗的时间和内存较多,总的原理就是,我们通过队列,一层一层的将节点压入队列中,然后再出队来统计数目。思路很简答,代码实现也很简单。

题目代码

class Solution {
    
    
    public int countNodes(TreeNode root) {
    
    
       if(root == null){
    
    
           return 0;
       }
       //创建队列
       Queue<TreeNode> quene = new LinkedList<TreeNode>();
       //头节点入队
       quene.offer(root);
       int count = 0;
       while(!quene.isEmpty()){
    
    
           int size = quene.size();
           //统计节点数目
           count+=size;
           for(int i = 0;i<size;i++){
    
    
               //出队
               TreeNode p = quene.poll();
               TreeNode left = p.left;
               TreeNode right = p.right;
               if(left!=null){
    
    
                   quene.offer(left);
               }
               if(right!=null){
    
    
                   quene.offer(right);
               }
           }
        }
       return count;
    }
}

利用完全二叉树特性法

做题思路

完全二叉树的定义:它是一棵空树或者它的叶子节点只出在最后两层,若最后一层不满则叶子节点只在最左侧
完全二叉树在我们学数据结构的时候都有所了解。如果是满二叉树的时候,则节点数为2^h - 1;h代表二叉树的高度,如果不是满二叉树的时候,则需先通过公式求出前h-1层的节点数,再加上最后一层的节点数。
该算法的主要思想是,先分别求出左子树和右子树的高度,然后判断是否是满二叉树,然后分两种情况进行讨论。如果是满的情况先求出左子树的情况,然后再对右子树递归求个数。非满二叉树先求出右子树的个数,然后再对左子树进行递归求个数。这个方法是我跟一个大佬学的,如果不容易理解的话,可以点击这个网址,查看大佬的说明讲解。大佬讲解

题目代码

class Solution {
    
    
    public int countNodes(TreeNode root) {
    
    
        if(root == null){
    
    
           return 0;
        } 
        int left = countLevel(root.left);
        int right = countLevel(root.right);
        if(left == right){
    
    
           //这里的含义是1向左移动left位,则为2^left次方
            return countNodes(root.right) + (1<<left);
        }else{
    
    
            return countNodes(root.left) + (1<<right);
        }
    }
    //求出子树高度
    private int countLevel(TreeNode root){
    
    
        int level = 0;
        while(root != null){
    
    
            level++;
            root = root.left;
        }
        return level;
    }
}

总结

看到这个题目的时候想到了两种方法,第三种方法也想到了但是不知道应该如何实现,不过学会了别人的解题方法,不也是一种进步吗?

作者:LeetCode
链接:https://leetcode-cn.com/problems/rotate-array/solution/xuan-zhuan-shu-zu-by-leetcode/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

猜你喜欢

转载自blog.csdn.net/tan45du_yuan/article/details/108926551