【完全二叉树节点数!】【深度优先】【广度优先】Leetcode 222 完全二叉树的节点个数

【完全二叉树】【深度优先】【广度优先】Leetcode 222 完全二叉树的节点个数

    • [:star:解法1 按照完全二叉树](#:star:解法1 按照完全二叉树)
    • [解法2 按照普通二叉树:深度优先遍历 后序 左右中](#解法2 按照普通二叉树:深度优先遍历 后序 左右中)
    • [解法3 按照普通二叉树:广度优先遍历 层序遍历](#解法3 按照普通二叉树:广度优先遍历 层序遍历)

---------------🎈🎈题目链接🎈🎈-------------------

⭐️解法1 按照完全二叉树

完全二叉树只有两种情况:

情况一:就是满二叉树,

情况二:最后一层叶子节点没有满。

对于情况一,可以直接用 2 ^ 树深度 - 1 来计算,注意这里根节点深度为1。

对于情况二,分别递归左孩子,和右孩子,递归到某一深度一定会有左孩子或者右孩子为满二叉树,然后依然可以按照情况1来计算。

java 复制代码
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public int countNodes(TreeNode root) {
        // 按照完全二叉树的特性 满二叉树的结点数为:2^depth - 1
        
        // 完全二叉树只有两种情况,情况一:就是满二叉树,情况二:最后一层叶子节点没有满
        // 如果是满二叉树,则节点个数为2^depth - 1
        // 对于情况二,分别递归左孩子,和右孩子,递归到某一深度一定会有左孩子或者右孩子为满二叉树,然后依然可以按照情况1来计算。
        if(root == null) return 0;
        TreeNode left = root.left;
        TreeNode right = root.right;
        int leftDepth = 1, rightDepth = 1;
        while(left != null){
            left = left.left;
            leftDepth ++;
        }
        while(right != null){
            right = right.right;
            rightDepth ++;
        }
        if(leftDepth == rightDepth){
            return (int)Math.pow(2,leftDepth) -1;
        }


        // 单层递归逻辑
        int leftnum = countNodes(root.left); //左
        int rightnum = countNodes(root.right);//右
        int result = leftnum + rightnum +1;  //中

        return result;
    }
}

解法2 按照普通二叉树:深度优先遍历 后序 左右中

/递归逻辑:左子树个数 右子树个数 加在一起返回给中间节点 +1

时间复杂度:O(n)

空间复杂度:O(log n),算上了递归系统栈占用的空间

java 复制代码
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public int countNodes(TreeNode root) {
        // 深度优先遍历 后序 左右中 
        
        if(root == null) return 0;  //终止条件
        
        // 递归逻辑:左子树个数 右子树个数 加在一起返回给中间节点 +1
        int leftnum = countNodes(root.left);
        int rightnum = countNodes(root.right);
        int result = leftnum+rightnum+1;
        return result;
         
    }
}       
    

解法3 按照普通二叉树:广度优先遍历 层序遍历

时间复杂度O(N)

空间复杂度O(N)

java 复制代码
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public int countNodes(TreeNode root) {
        // 层序遍历
        if(root == null) {
            return 0;
        }
        Queue<TreeNode> myqueue= new LinkedList<>();
        int result = 0;
        myqueue.add(root);
        while(!myqueue.isEmpty()){
            int size = myqueue.size();
            result += size;
            for(int i = 0; i<size;i++){
                TreeNode temp = myqueue.poll();
                if(temp.left != null){
                    myqueue.add(temp.left);
                }
                if(temp.right != null){
                    myqueue.add(temp.right);
                }
            }
        }
        return result;
    }
}
相关推荐
卡尔特斯3 小时前
Android Kotlin 项目代理配置【详细步骤(可选)】
android·java·kotlin
白鲸开源4 小时前
Ubuntu 22 下 DolphinScheduler 3.x 伪集群部署实录
java·ubuntu·开源
ytadpole4 小时前
Java 25 新特性 更简洁、更高效、更现代
java·后端
纪莫4 小时前
A公司一面:类加载的过程是怎么样的? 双亲委派的优点和缺点? 产生fullGC的情况有哪些? spring的动态代理有哪些?区别是什么? 如何排查CPU使用率过高?
java·java面试⑧股
JavaGuide5 小时前
JDK 25(长期支持版) 发布,新特性解读!
java·后端
用户3721574261355 小时前
Java 轻松批量替换 Word 文档文字内容
java
白鲸开源5 小时前
教你数分钟内创建并运行一个 DolphinScheduler Workflow!
java
CoovallyAIHub5 小时前
中科大DSAI Lab团队多篇论文入选ICCV 2025,推动三维视觉与泛化感知技术突破
深度学习·算法·计算机视觉
Java中文社群6 小时前
有点意思!Java8后最有用新特性排行榜!
java·后端·面试
代码匠心6 小时前
从零开始学Flink:数据源
java·大数据·后端·flink