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

关于树的算法题总结

目录

437. 路径总和 III - 力扣(LeetCode)

105. 从前序与中序遍历序列构造二叉树 - 力扣(LeetCode)

103. 二叉树的锯齿形层序遍历 - 力扣(LeetCode)

230. 二叉搜索树中第 K 小的元素 - 力扣(LeetCode)


437. 路径总和 III - 力扣(LeetCode)

中等 通过率 48.3%

核心思想:

为了求该二叉树里节点值之和等于targetSum路径的数目。

路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。

我们很容易可以想到用DFS去遍历所有节点,当节点值之和等于targetSum时就cnt++。

但是为了找到所有的路径,我们还需要从不同的节点开始做DFS。

属于是DFS里面套了一个DFS。

/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} * }; */ class Solution { public: //属于是对每一个结点都做一次DFS int cnt = 0; void dfs(TreeNode* root, long long targetSum){ if(root==nullptr) return; if(targetSum-root->val==0) cnt++; dfs(root->left, targetSum-root->val); dfs(root->right, targetSum-root->val); } int pathSum(TreeNode* root, int targetSum) { if(root==nullptr) return cnt; //属于是DFS里面再套一个DFS 真暴力! dfs(root, targetSum); pathSum(root->left, targetSum); pathSum(root->right, targetSum); return cnt; } };

105. 从前序与中序遍历序列构造二叉树 - 力扣(LeetCode)

中等 通过率 73.2%

核心思想:

1. 写一个函数buildTree可以基于树的前序和树的中序找到树的根root和左右子树的前中序

2. 递归这个buildTree函数

root->left = buildTree(左子树的前序,左子树的中序)

root->right = buildTree(右子树的前序,右子树的中序)

/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} * }; */ class Solution { public: //preorder 和 inorder 均 无重复 元素 //首先根据preorder拿到根root //然后再根据根凑够inorder里面找到左右子树 inleft 和 inright //重点:然后基于左右子树的数量,可以去preorder里面找到 preleft 和 preright //那么问题又变成了在root的左右子树里面找左右子树,发现任务与之前是一样的 //所以采用递归实现! TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) { if(preorder.empty()) return nullptr; TreeNode* res = new TreeNode(preorder[0]); vector<int> inleft; vector<int> inright; int inflag = 0; for(int i : inorder){ if(i==res->val){ inflag=1; continue; } if(inflag==0) inleft.push_back(i); else inright.push_back(i); } //只要我们在中序遍历中定位到根节点, //那么我们就可以分别知道左子树和右子树中的节点数目 vector<int> preleft; vector<int> preright; for(int i = 1; i<preorder.size(); i++){ if(i<=inleft.size()){ preleft.push_back(preorder[i]); }else preright.push_back(preorder[i]); } res->left = buildTree(preleft, inleft); res->right = buildTree(preright, inright); return res; } };

103. 二叉树的锯齿形层序遍历 - 力扣(LeetCode)

中等 通过率 60.7%

核心思想:本质就是层序遍历,只不过偶数层不变,奇数层逆序。

/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} * }; */ class Solution { public: vector<vector<int>> zigzagLevelOrder(TreeNode* root) { //思路就是基于队列的BFS vector<vector<int>> res; queue<TreeNode*> qe; if(root!=nullptr) qe.push(root); while(!qe.empty()){ vector<int> level; int n = qe.size(); for(int i = 0; i<n; i++){ TreeNode* now = qe.front(); level.push_back(now->val); qe.pop(); if(now->left!=nullptr) qe.push(now->left); if(now->right!=nullptr) qe.push(now->right); } //只不过最后push_back的时候做个判断如果是奇数层就reverse一下 if(res.size()&1==1) reverse(level.begin(), level.end()); res.push_back(level); } return res; } };

230. 二叉搜索树中第 K 小的元素 - 力扣(LeetCode)

中等 通过率 79.8%

核心思想:因为二叉搜素树的中序遍历是有序的,所以我们在进行中序遍历的时候,用cnt记录一下现在遍历了几个结点了,如果遍历到了低k小的结点就return就好了。

/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} * }; */ class Solution { public: int cnt = 0; int res = 0; int kthSmallest(TreeNode* root, int k) { if(root==nullptr) return 0; kthSmallest(root->left, k); if(cnt!=-1) cnt++; if(cnt>=k){ res = root->val; cnt = -1; } kthSmallest(root->right, k); return res; } }; /* 非递归的中序遍历也很重要 class Solution { public: int kthSmallest(TreeNode* root, int k) { stack<TreeNode *> stack; while (root != nullptr || stack.size() > 0) { while (root != nullptr) { stack.push(root); root = root->left; } //先遍历到最左边的结点包括了(左节点和根节点) root = stack.top(); stack.pop(); // 等价于输出(左节点或根节点) --k; if (k == 0) { break; } root = root->right; //然后再来看右边的结点 } return root->val; } }; */ class Solution { public: int kthSmallest(TreeNode* root, int k) { stack<TreeNode*> nodes; while(root!=nullptr){ nodes.push(root); root = root->left; } while(!nodes.empty()){ TreeNode* r = nodes.top(); nodes.pop(); k--; if(k==0) return r->val; //如果r有右子树的话 if(r->right!=nullptr){ TreeNode* p = r->right; while(p!=nullptr){ nodes.push(p); p = p->left; } } } return -1; } };
http://www.jsqmd.com/news/542310/

相关文章:

  • 华为交换机IPSG配置实战:从DHCP Snooping到静态绑定,一次讲清防IP欺骗的完整流程
  • Unsloth Docker部署详解:从零开始搭建训练环境
  • 双模型对比:OpenClaw同时接入nanobot与云端API的性能测试
  • 2026年知名的进口PCD复合片价格/进口PCD复合片刀粒公司选择指南 - 品牌宣传支持者
  • 如何用Mayan EDMS在10分钟内搭建企业级文档管理系统?终极免费方案揭秘![特殊字符]
  • ouch社区贡献指南:从提交PR到成为核心贡献者
  • 避坑指南:HuggingFace本地数据集加载常见的5个报错及解决方法
  • Qwen1.5-1.8B-GPTQ-Int4实战教程:Chainlit+FastAPI构建混合API服务
  • 2026年市面上有实力的外墙瓷砖厂商怎么选择,外墙瓷砖源头厂家口碑分析奥古拉诚信务实提供高性价比服务 - 品牌推荐师
  • EMI滤波器选型指南:从共模与差模噪声到实际应用场景
  • 30分钟搭建OpenClaw开发环境:Qwen3-32B+RTX4090D镜像联调
  • Dify离线部署实战:手把手教你构建无网环境下的插件打包方案
  • Kimi-VL-A3B-Thinking Chainlit定制化开发:添加历史记录/多用户会话/图片标注功能
  • Vision-Agents:构建下一代实时视觉AI代理的终极指南
  • Hunyuan-MT-7B应用指南:高校教学、民族翻译、企业私有化部署
  • 用MATLAB玩转雷达对抗:手把手教你用Sarsa和Q-learning实现智能干扰决策
  • 运维 5 大出路!网络安全凭什么成为转行首选赛道?
  • 终极Python GUI开发指南:如何用CustomTkinter构建现代化桌面应用
  • vLLM-v0.17.1效果展示:vLLM在边缘设备Jetson Orin上轻量部署实测
  • 银河麒麟服务器系统4.02-sp2实战:飞腾架构下的虚拟机优化与远程管理
  • FRCRN语音降噪工具作品分享:10组高难度噪声场景(鸡尾酒会/工地/商场)降噪成果
  • Phi-4-Reasoning-Vision智能助手:医疗影像图文问答系统构建实践
  • JDK17下Lombok报错?手把手教你解决IllegalAccessError问题(附最新版本配置)
  • 2026年评价高的真空预压排水板/江苏真空预压排水板/江苏热熔整体塑料排水板推荐公司 - 品牌宣传支持者
  • 探索图强化学习:构建智能决策系统的关键技术融合
  • Realistic Vision V5.1开源镜像部署教程:Docker+Streamlit一体化环境搭建
  • Ouch无障碍模式:为视觉障碍用户设计的贴心压缩工具
  • OpenClaw安全配置要点:Qwen3.5-4B-Claude-4.6-Opus-Reasoning-Distilled-GGUF本地运行权限管理
  • eBPF是什么
  • YOLOv11 目标检测与 Pixel Dream Workshop 联动:为检测结果自动生成描述图