当前位置: 首页 > news >正文

《代码随想录》刷题打卡day13:二叉树part03

文章目录

        • 【平衡二叉树】
        • 【二叉树的所有路径】
        • 【左叶子之和】
        • 【完全二叉树的节点个数】
【平衡二叉树】

求深度适合用前序遍历,而求高度适合用后序遍历。
回溯通常都不用迭代法,递归一定要掌握!

// 返回以该节点为根节点的二叉树的高度,如果不是平衡二叉树了则返回-1 int getHeight(TreeNode* node) { if (node == NULL) { return 0; } int leftHeight = getHeight(node->left); if (leftHeight == -1) return -1; int rightHeight = getHeight(node->right); if (rightHeight == -1) return -1; return abs(leftHeight - rightHeight) > 1 ? -1 : 1 + max(leftHeight, rightHeight); } bool isBalanced(TreeNode* root) { return getHeight(root) == -1 ? false : true; }
【二叉树的所有路径】

思路:

  1. 来一个节点,先存进路径
  2. 到叶子节点,就把路径存起来
  3. 走完一条路,必须回退一步(回溯),再走另一条路

回溯和递归是一一对应的,有一个递归,就要有一个回溯

void travelsal(TreeNode* cur, vector<int>& path, vector<string>& result){ path.push_back(cur->val);// 中,中为什么写在这里,因为最后一个节点也要加入到path中 // 说明到了叶子结点 if(cur->left == nullptr && cur->right == nullptr){ string sPath; for(int i = 0;i < path.size() - 1;i++){ sPath += to_string(path[i]); sPath += "->"; } sPath += to_string(path[path.size() - 1]); result.push_back(sPath); } // 未到叶子结点 if(cur->left){ travelsal(cur->left, path, result); path.pop_back();// 回溯 } if(cur->right){ travelsal(cur->right, path, result); path.pop_back();// 回溯 } } vector<string> binaryTreePaths(TreeNode* root) { vector<int> path; vector<string> result; if(root == nullptr) return result; travelsal(root, path, result); return result; }
【左叶子之和】

思路:

  1. 遍历二叉树所有节点(栈 / 递归都行)
  2. 对每个节点,只看它的左孩子
  3. 判断左孩子是不是左叶子
  1. 继续遍历右孩子
  2. 最后返回 sum

递归法:

int sumOfLeftLeaves(TreeNode* root) { if(root == nullptr) return 0;// 如果当前节点是空节点,左叶子必然是0 if(root->left == nullptr && root->right == nullptr) return 0;// 如果父节点是叶子结点,其左叶子也必然是0 int leftValue = sumOfLeftLeaves(root->left); if(root->left != nullptr && root->left->left == nullptr && root->left->right == nullptr){// 左子树就是一个左叶子的情况 leftValue = root->left->val; } int rightValue = sumOfLeftLeaves(root->right); int sum = leftValue + rightValue; return sum; }

迭代法:

int sumOfLeftLeaves(TreeNode* root) { if(root == nullptr) return 0; stack<TreeNode*> st; st.push(root); int sum = 0; while(!st.empty()){ TreeNode* cur = st.top(); st.pop(); if(cur->left){ st.push(cur->left); if(!cur->left->left && !cur->left->right){ sum += cur->left->val; st.pop(); } } if(cur->right){ st.push(cur->right); } } return sum; }
【完全二叉树的节点个数】

递归法:最大深度略加修改

int getNodesSum(TreeNode* cur){ if(cur == nullptr) return 0; int leftNum = getNodesSum(cur->left); int rightNum = getNodesSum(cur->right); int TreeNum = leftNum + rightNum + 1; return TreeNum; } int countNodes(TreeNode* root) { return getNodesSum(root); }

迭代法:层序遍历模板略加修改

int countNodes(TreeNode* root) { if(root == nullptr) return 0; queue<TreeNode*> que; que.push(root); int sum = 0; while(!que.empty()){ int size = que.size(); for(int i = 0; i < size; i++){ TreeNode* node = que.front(); sum++; que.pop(); if(node->left) que.push(node->left); if(node->right) que.push(node->right); } } return sum; }
http://www.rkmt.cn/news/1506010.html

相关文章:

  • 如何安全高效使用YimMenu:GTA5终极辅助工具完整指南
  • N46Whisper:用AI语音识别技术革新日语字幕制作流程
  • 2026年6月保鲜库供应商有哪些,双温冷库/冷藏库/土建冷库/冷库/冷冻库/装配式冷库/集装箱冷库,保鲜库供应商怎么选择 - 品牌推荐师
  • SAP ABAP实战:用BAPI_PRODORD_CREATE批量生成工单,附Excel模板和完整代码
  • NE1617A温度监控芯片:从ΔVBE原理到SMBus驱动的嵌入式热管理实战
  • NE1619硬件监控芯片实战:从电路设计到SMBus驱动的嵌入式系统健康管理
  • 2026寄大件哪个物流便宜?寄半折5折起全网比价实测 - 快递物流资讯
  • 紧凸集嵌入正则性:从泛函分析到非交换理论
  • 信息学奥赛解题实战:OpenJudge NOI 1.7 27 单词翻转的三种编程思路详解
  • 086、Gold-YOLO 黄金特征聚合:Low-FAM 和 High-FAM 双路径信息融合的实现
  • 基于WCT1000的5W Qi无线充电发射器硬件设计全解析
  • PCA6416A I2C I/O扩展器:解决MCU引脚不足与混合电压系统设计难题
  • Git安装教程超详细版
  • 2026槟榔加盟模式横评:和诚道居首,5大品牌对比,哪种打法适合你? - 品牌官
  • 深入解析PCA8576D:LCD段式驱动器原理、硬件设计与软件驱动实战
  • 2026年6月欧米茄全国官方维修服务中心汇总|官方门店地址、官方服务电话公示 - 信息热点
  • 15分钟搞定专业级黑苹果:OpCore-Simplify终极配置指南
  • 从零构建无人机飞控系统:Avem开源项目完全指南
  • 告别盲打!手把手教你给《饥荒》所有生物加上实时血条(附完整Lua代码)
  • 2026沈阳名牌包包回收避坑全攻略,拒绝线上虚高线下压价套路 - 禹竞
  • CTF 红队专用 AI 求解AI 引擎 Cairn 系统,化轻量化部署,红队、CTF、漏洞研究一站式解决方案
  • 2026年照明厂家推荐:别只盯着老字号,这几家值得看看 - 信息热点
  • 从机械键盘到个性音效:3步打造专属打字氛围感
  • Linux Schedutil 的 cached_raw_freq:频率缓存优化
  • zteOnu:中兴光猫工厂模式解锁工具,5步获取永久Telnet权限
  • 开发踩坑学习记录|若依Vue3\+Pinia\+Vite\+FBX模型 实战报错复盘
  • 2026青岛办公室厂房装修推荐,材料直供省 30% 预算,工期提速 30% 交付更快 - 信息热点
  • Linux CPU 频率调节的热插拔支持:CPU 上下线时的调频处理
  • PCIe链路训练:状态机跳转的时序与条件深度解析
  • NXP PCA9558芯片解析:集成I/O扩展、EEPROM与软DIP开关的嵌入式硬件管理方案