第20天(简单题 二分查找递归)

news/2025/11/10 0:46:57/文章来源:https://www.cnblogs.com/wy0518/p/19205615

打卡第二十天
3道简单题 (简单在哪里....二叉树咋这么难)
image


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


方法一: 递归:完全二叉树只有两种情况,一是满二叉树,二是最后一层叶子节点没有满。
对于情况一,用 2^树深度 - 1 来计算。
对于情况二,分别递归左子树和右子树,递归计算左子树节点数 + 右子树节点数 + 1。

代码:

class Solution {
public:int countNodes(TreeNode* root) {if (root == nullptr){return 0;}TreeNode* left = root->left;//左子树指针TreeNode* right = root->right;//右子树指针int leftDepth = 0, rightDepth = 0;//初始化左右子树深度为0while (left) {  // 求左子树深度left = left->left;leftDepth++;}while (right) { // 求右子树深度right = right->right;rightDepth++;}if (leftDepth == rightDepth) {return (2 << leftDepth) - 1; // (2<<1) 相当于2^2,所以leftDepth初始为0}return countNodes(root->left) + countNodes(root->right) + 1;}
};


方法二: 二分查找+位运算
完全二叉树的最后一层节点编号是连续的,在 [2^level, 2^(level+1)-1] 范围内二分查找最后一个存在的节点
节点编号 k 的二进制表示(去掉最高位的1)就是从根节点到该节点的路径: 0 表示向左,1 表示向右

位运算实现逻辑:
image


代码:

class Solution {
public:int countNodes(TreeNode* root) {if (root == nullptr) {return 0;}// 计算树的高度int level = 0;TreeNode* node = root;while (node->left != nullptr) {level++;node = node->left;}// level层是最底层,节点编号从 2^level 到 2^(level+1)-1int low = 1 << level;                    // 最低可能节点编号:2^levelint high = (1 << (level + 1)) - 1;       // 最高可能节点编号:2^(level+1)-1// 二分查找:在[low, high]范围内找到最后一个存在的节点编号while (low < high) {int mid = (high - low + 1) / 2 + low;  // 向上取整,避免死循环if (exists(root, level, mid)) {low = mid;        // mid存在,说明最终答案 >= mid} else {high = mid - 1;   // mid不存在,说明最终答案 < mid}}return low;  // 此时low == high,就是节点总数}// 判断编号为k的节点是否存在bool exists(TreeNode* root, int level, int k) {int bits = 1 << (level - 1);  // 用于位运算的掩码TreeNode* node = root;// 根据k的二进制表示从高位到低位遍历路径while (node != nullptr && bits > 0) {if (!(bits & k)) {     // 当前位为0,往左走node = node->left;} else {               // 当前位为1,往右走node = node->right;}bits >>= 1;           // 移到下一位}return node != nullptr;   // 如果node不为空,说明该节点存在}
};

int bits = 1 << (level - 1); // 用于位运算的掩码

image

耗时≈两小时 明天继续

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/960858.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

20251110周日日记

20251110周日日记今天哥哥婚礼,太感动了,百年好合! https://github.com/amusi/CVPR2025-Papers-with-Code?tab=readme-ov-file ...更权威的目录 https://github.com/SkalskiP/top-cvpr-2025-papers?tab=readme…

当前操作系统的应用主题工具类 - C#小函数类推荐

当前操作系统的应用主题工具类 - C#小函数类推荐Posted on 2025-11-10 00:32 lzhdim 阅读(0) 评论(0) 收藏 举报/***当前操作系统的应用主题Austin Liu 刘恒辉Project Manager and Software DesignerE-Mail: lzhd…

11.6总结

1.今天完成了三餐搭配系统很开心

21. 数据库编程

Go 语言内置包 database/sql 为所有数据库提供了通用接口,也就是说所有数据库的增删改查操作在 database/sql 中都有对应的方法实现,不同的数据库只需要更换相应的数据库驱动即可,无须修改代码。例如当前使用的SQLi…

11.3总结

1.今天进行了期中考试,完成了管理系统 2.明天继续完成系统中的页面部分

22.网络编程

22.1 TCP/IP协议栈TCP/IP(Transmission Control Protocol/Internet Protocol),中文翻译为传输控制协议/因特网互联协议。它是一个包含很多工作在不同层的协议族,其中最著名的两个协议分别是TCP和IP协议。TCP/IP协议一…

11.4总结

1.今天完成了系统页面 2.系统基本完成 3.明天继续完成系统的简约化设计

11.5总结

1.今天自主开发了一日三餐搭配系统的页面和程序 2.明天继续完成数据库部分

10.31总结

1.今天去泰山累了啥都没干

cve-2014-4148 利用样本分析

文章主要分析cve-2014-4148在该样本中的利用过程,不对该漏洞的成因进行梳理。该样本利用cve-201404148进行任意代码的执行,通过替换Token实现提权。关键步骤: 通过NtQueueThreadApcEx传入异常的参数,构建一个短小的…

2025ccpc女生赛题解

补题链接 : https://qoj.ac/contest/2564 J. 后鼻嘤 在每个以 n 结尾的字符串后添加 g 并输出 读入一整行法 //2025-11-02 #include <iostream> #include <cstdio> #include <algorithm> #include …

Day16盒子模型

盒子模型的基本组成<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-s…

OpenOCD简明指南

OpenOCD(Open On-Chip Debugger)是一个开源的片上调试工具,支持多种调试器和目标芯片。它通过 JTAG、SWD 等接口与目标设备通信,提供固件烧录、调试、内存操作等功能。一、OpenOCD 简介 OpenOCD(Open On-Chip Deb…

2025Dec.居家集训游记

在家集训也能叫游记吗? 总所周知每一个OIer都爱写这东西 (欸我CSP-S游记还没写) ,所以在家集训也要写。 DAY1 11.9 有点忘了,游记是10号写的。 好像不安了一天,因为我太菜了,也有点想学校里的朋友。 学习了 kru…

电商财务不求人!一张图看懂工作流程,算清每一笔账 - 智慧园区

做电商公司的财务,是不是经常感觉像个“救火队员”?刷单、推广费、平台账单、多店核算……传统行业那套流程在这里好像失灵了。 别慌!电商账务看似复杂,但只要抓住核心流程,就能化繁为简。这篇文章将带你走一遍电…

OI 笑传 #26

Seikai小清新 DP 回。解说会补的。 Luogu P14460 mx 的 NOIP 模拟 T1,赛时连猜带蒙结果 30min 切了( codeShow me the code #define rd read() #define mkp make_pair #define ls p<<1 #define rs p<<1|…

20232327 2025-2026-1 《网络与系统攻防技术》实验四实验报告

20232327 2025-2026-1 《网络与系统攻防技术》实验四实验报告 1. 实验内容 1.1 本周学习内容 本周学习了恶意代码分析的基本方法,静态分析和动态分析的核心概念。静态分析主要通过代码结构和API调用等特征来识别恶意行…

Gas 优化技巧

Gas 优化技巧 gas 优化技巧并不总是有效 注意复杂性和可读性 这里无法对每个主题进行全面处理 我们不讨论特定应用的技巧最重要的是:尽可能避免零到一的存储写入 缓存存储变量:仅写入和读取存储变量一次 打包相关变量…

2025.11.9总结

用AI写项目,太坐牢,今天继续写项目,用ai写,虽然能写出来,但是这是对于小型功能来说,能写,能改小bug,一旦项目的量级上来的,ai也写不出来。 于是这里就引申出了写项目更高级的做法,将大项目拆分成数个独立的小…