完全二叉树的节点个数

本文介绍了LeetCode 222题的解决方案,主要探讨了两种方法:一是通过DFS或BFS解决;二是利用完全二叉树的特性,结合二分查找和位运算来确定节点数量。在第二种方法中,通过找到树的高度,并确定最后一层的编码范围,使用位运算判断特定编码节点的存在性。
摘要由CSDN通过智能技术生成

leetcode 222 题 [medium]
中:完全二叉树的节点个数
英:Count Complete Tree Nodes
在这里插入图片描述

题解一:

使用DFS或BFS可以直接简单的解决这道题

  1. 实现:DFS + 优化(提前结束递归)

    /**
     * Definition for a binary tree node.
     * function TreeNode(val) {
     *     this.val = val;
     *     this.left = this.right = null;
     * }
     */
    /**
     * @param {TreeNode} root
     * @return {number}
     */
    var countNodes = function(root) {
         
        /**
         * DFS + 优化
         * 时间复杂度:O(n) + 优化
         * 空间复杂度: O(logn) 递归栈空间
         */
        // 预处理
        if(!root) return 0;
        
        // 计算树高(完全二叉树,一直找左子节点,一定能到达最后一层)
        let height = 1;			// 树高度
        let node = root;
        while(node = node.left) height++;
        
        // DFS
        let bottomCount = 0;	// 统计最后一层的结点数
        let canStop = false; 	// 优化:当查询到最后一层结束,canStop设置为true,表明后续的递归无需再进行
        function recurse(_root, _currHeight = 1
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值