【LeetCode-中等题】 222. 完全二叉树的节点个数

文章目录

题目

方法一:把该题当做一个普通的二叉树来做(任何遍历都可以)

例如:二叉树的前序遍历(维护一个全局变量)递归无返回值

java 复制代码
class Solution {
    int num = 0;
    public int countNodes(TreeNode root) {
        dfs(root);
        return num;
    }
    public void dfs(TreeNode root){
        if(root == null) return;
        num++;
        dfs(root.left);
        dfs(root.right);
    }
}

方法二:利用完全二叉树的性质来做

  1. 当前节点只要满足完全二叉树的话,可以通过2^depth-1来计算以当前节点为父节点的数的节点数,这样减少很多递归操作,不需要递归找到每一个节点
  2. 当前节点不满足二叉树的性质 ,那就走常规递归到下一层,再来判断

一定要画图 模拟递归过程

java 复制代码
lass Solution {
    public int countNodes(TreeNode root) {
        return dfs(root);
    }
    public int dfs(TreeNode root){
        if(root == null) return 0;
        int leftsum = 1;//root不为null  自然高度起始就是1
        int rightsum = 1;
        TreeNode left = root.left;
        TreeNode right = root.right;
        //寻找以该节点为父节点的左右子树的高度
        while(left!=null){
            left = left.left;
            leftsum++;
        }
         while(right!=null){
            right = right.right;
            rightsum++;
        }
        //如果左右子树的高度相等  说明以该节点为父节点的数是完全二叉树  ,所以可以按照完全二叉树的性质来计算节点数 2的高度次方-1  
        if(rightsum == leftsum) return (int)Math.pow(2, rightsum) - 1;
        //如果左右子树的高度不相等  那么进入下一层常规递归
        int left_ = dfs(root.left);
        int right_ = dfs(root.right);
        return left_+right_+1;//最后返回左右子树节点数之和在加上本节点
    }
}
相关推荐
w_zero_one14 小时前
算法--模拟
java·数据结构·算法
秋天的怀念_David14 小时前
算法一千零一夜 · 第十三夜 幻方,武侠世界里的数学迷宫
java·程序人生·算法
秋天的怀念_David15 小时前
算法一千零一夜 · 第十四夜 幻方与奇妙的二进制
java·程序人生·算法
薛定e的猫咪15 小时前
(ICLR 2020)MAML 靠的不是快速学习,而是特征复用
人工智能·深度学习·学习·算法·机器学习
薛定e的猫咪15 小时前
(ICLR 2026)DF-META:面向 FJSP 的无导数元学习实例自适应调度
人工智能·深度学习·学习·算法·机器学习
java_nnnn17 小时前
LeetCode刷题滑动窗口(水果成篮+找到字符串中所有字母的异位词)Java
java·开发语言·leetcode
小羊没烦恼!17 小时前
异步编程:线程概述及使用
java·开发语言·mysql·算法·c#
wanderist.17 小时前
202609CSP认证P3
算法
云淡风轻~窗明几净18 小时前
角谷猜想最接近严格证明的测试 Version1.1.1
人工智能·算法·机器学习·图论
机器学习之心18 小时前
PINN × SVM × NSGA-II × 熵权TOPSIS:一套跑通「建模—优化—决策」的多目标优化框架
算法·机器学习·支持向量机