美文网首页力扣解题报告
解题报告 - LeetCode 222. 完全二叉树的节点

解题报告 - LeetCode 222. 完全二叉树的节点

作者: 大涛先生 | 来源:发表于2022-10-13 07:50 被阅读0次

    LeetCode 222. 完全二叉树的节点个数

    @TOC

    题目描述

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

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

    示例:[图片上传失败...(image-ca28f6-1665618553274)]

    输入:root = [1,2,3,4,5,6]
    输出:6
    

    提示:

    树中节点的数目范围是[0, 5 * 104]
    0 <= Node.val <= 5 * 104
    题目数据保证输入的树是 完全二叉树
    

    一、解题关键词

    完全二叉树
    节点个数
    

    二、解题报告

    1.思路分析

    1. 树的第一反映 要递归(1、隐藏内部细节 2、重复性计算过程)
    2. 左子树 + 右子树 + 根节点

    2.时间复杂度

    3.代码示例

    /**
     * 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(null == root) return 0;
            int left = countNodes(root.left);
            int right = countNodes(root.right);
    
            return left + right +1;
    
        }
    }
    

    代码二:

    /**
     * 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(null == root){
                return 0;
            }
            int left = countLevel(root.left);
            int right = countLevel(root.right);
    
            if(left == right){
                return countNodes(root.right) +(1<< left);
            }else{
                return countNodes(root.left) + (1<<right);
            }
        }
        int countLevel(TreeNode root){
            int level = 0;
            while(root != null){
                level++;
                root = root.left;
            }
            return level;
        }
    }
    

    代码三:

    /**
     * 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(null == root){
                return 0;
            }
            TreeNode node = root;
            int leftH = 0;
            int rightH = 0;
            while(null != node){
                leftH ++;
                node = node.left;
            }
            while(null != node){
                rightH ++;
                node = node.right;
            }
            if(leftH == rightH){
                return (int) Math.pow(2,leftH + 1) -1;
            }
            return countNodes(root.left) + countNodes(root.right) + 1;
        }
    }
    

    4.知识点

    1<< left == (int) Math.pow(2,leftH + 1) -1
    

    相关文章

      网友评论

        本文标题:解题报告 - LeetCode 222. 完全二叉树的节点

        本文链接:https://www.haomeiwen.com/subject/etzxzrtx.html