3.二叉树的经典算法
一.根据二叉树构建字符串题目链接:606. 根据二叉树创建字符串 - 力扣LeetCode/** * 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: string tree2str(TreeNode* root) { string str; if(root nullptr) { return str; } str to_string(root-val); if(root-left || root-right) { str (; str tree2str(root-left); str ); } if(root-right) { str (; str tree2str(root-right); str ); } return str; } };二.二叉树的层序遍历题目链接:102. 二叉树的层序遍历 - 力扣LeetCode当前层出完了,后续(下一层节点都进入队列了)/** * 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: vectorvectorint levelOrder(TreeNode* root) { queueTreeNode* q; vectorvectorint vv; if(rootnullptr) { return vv; } int levelsize1; q.push(root); while(!q.empty()) { vectorint v; while(levelsize--) { TreeNode* front q.front(); q.pop(); v.push_back(front-val); if(front-left) { q.push(front-left); } if(front-right) { q.push(front-right); } } vv.push_back(v); levelsizeq.size(); } return vv; } };三.二叉树的层序遍历二题目链接:107. 二叉树的层序遍历 II - 力扣LeetCode和上一个题目是一样的,只要逆置一下就可以了/** * 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: vectorvectorint levelOrderBottom(TreeNode* root) { vectorvectorint ans; if(root nullptr) { return ans; } int x 1; queueTreeNode* q; q.push(root); while(q.size()) { vectorint v1; x q.size(); while(x--) { TreeNode* t1 q.front(); q.pop(); v1.push_back(t1-val); // cout t1-val ; if(t1-left) { q.push(t1-left); } if(t1-right) { q.push(t1-right); } } ans.push_back(v1); } reverse(ans.begin(),ans.end()); return ans; } };四.二叉树的最近公共祖先题目链接:236. 二叉树的最近公共祖先 - 力扣LeetCode/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: bool IsIntree(TreeNode* t,TreeNode* x) { if(t nullptr) { return false; } return t x || IsIntree(t-left,x) || IsIntree(t-right,x); } TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) { if(root nullptr) { return nullptr; } if(root p || root q) { return root; } bool pInLeft IsIntree(root-left,p); bool pInRight !pInLeft; bool qInLeft IsIntree(root-left,q); bool qInRight !qInLeft; if((pInLeft qInRight) || (qInLeft pInRight)) { return root; } else if(pInLeft qInLeft) { return lowestCommonAncestor(root-left,p,q); } else { return lowestCommonAncestor(root-right,p,q); } } };这个代码效率是较慢的O(n ^ 2)我们来想一想,更加优秀的算法/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: bool GetPath(TreeNode* root,TreeNode* x,stackTreeNode* path) { if(root nullptr) { return false; } path.push(root); if(root x) { return true; } if(GetPath(root-left,x,path)) { return true; } if(GetPath(root-right,x,path)) { return true; } path.pop(); return false; } TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) { stackTreeNode* pPath,qPath; GetPath(root,p,pPath); GetPath(root,q,qPath); while(pPath.size() ! qPath.size()) { if(pPath.size() qPath.size()) { pPath.pop(); } else { qPath.pop(); } } while(pPath.top() ! qPath.top()) { pPath.pop(); qPath.pop(); } return pPath.top(); } };五.二叉树转化为排序的双向链表题目链接:LCR 155. 将二叉搜索树转化为排序的双向链表 - 力扣LeetCode/* // Definition for a Node. class Node { public: int val; Node* left; Node* right; Node() {} Node(int _val) { val _val; left NULL; right NULL; } Node(int _val, Node* _left, Node* _right) { val _val; left _left; right _right; } }; */ class Solution { public: void InOrderConvert(Node* cur,Node* prev) { if(cur nullptr) { return; } InOrderConvert(cur-left,prev); cur-left prev; if(prev) prev-right cur; prev cur; InOrderConvert(cur-right,prev); } Node* treeToDoublyList(Node* root) { if(root nullptr) { return nullptr; } Node* prev nullptr; InOrderConvert(root,prev); Node* head root; while(head head-left) { head head-left; } head-left prev; prev-right head; return head; } };六.前序和中序构建二叉树题目链接:105. 从前序与中序遍历序列构造二叉树 - 力扣LeetCode前序遍历,我们只能确定根(所以还要确定中序)/** * 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: TreeNode* build(vectorint preorder,vectorint inorder,int prei,int inbegin,int inend) { if(inbegin inend) { return nullptr; } TreeNode* root new TreeNode(preorder[prei]); int rooti inbegin; while(rooti inend) { if(preorder[prei] inorder[rooti]) { break; } else { rooti; } } prei; root-left build(preorder,inorder,prei,inbegin,rooti - 1); root-right build(preorder,inorder,prei,rooti 1,inend); return root; } TreeNode* buildTree(vectorint preorder, vectorint inorder) { int i 0; return build(preorder,inorder,i,0,inorder.size()-1); } };七.二叉树的前序遍历题目链接:144. 二叉树的前序遍历 - 力扣LeetCode/** * 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: vectorint preorderTraversal(TreeNode* root) { stackTreeNode* st; TreeNode* cur root; vectorint v; while(cur || st.size()) { while(cur) { v.push_back(cur-val); st.push(cur); cur cur-left; } TreeNode* top st.top(); st.pop(); cur top-right; } return v; } };八.二叉树的中序遍历题目链接:94. 二叉树的中序遍历 - 力扣LeetCode这个只是访问的时机不太一样/** * 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: vectorint inorderTraversal(TreeNode* root) { stackTreeNode* st; TreeNode* cur root; vectorint v; while(cur || st.size()) { while(cur) { st.push(cur); cur cur-left; } TreeNode* top st.top(); st.pop(); v.push_back(top-val); cur top-right; } return v; } };九.二叉树的后序遍历题目链接:145. 二叉树的后序遍历 - 力扣LeetCode/** * 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: vectorint postorderTraversal(TreeNode* root) { stackTreeNode* st; TreeNode* cur root; TreeNode* prev nullptr; vectorint v; while(cur || st.size()) { while(cur) { st.push(cur); cur cur-left; } TreeNode* top st.top(); if(top-right nullptr || top-right prev) { v.push_back(top-val); st.pop(); prev top; } else { cur top-right; } } return v; } };

相关新闻

1 如何学习VSCode

1 如何学习VSCode

1.1学会搜索在学习新技能的过程中,无论是是谁,总会遇到各种各样的问题,学会搜索是学习一项技能的必经之路。除了Bing、CSDN、Stack Overflow,Visual Studio Code官网和Visual Stdio Code的GitHub仓库也是搜索解决方案过程中的最好…

2026/7/7 8:21:56 阅读更多 →
代码原创保卫战:对抗AI抄袭的加密术——软件测试工程师的防御体系构建

代码原创保卫战:对抗AI抄袭的加密术——软件测试工程师的防御体系构建

第一章:AI抄袭风暴中的测试危机 1.1 当代码生成器成为“高级抄写员” 案例警示:某金融科技公司因测试用例中混入ChatGPT生成的SQL注入检测代码,导致0day漏洞被攻击者反向破解 行业现状- 2025年GitHub扫描报告显示:38%的提交代码…

2026/5/17 11:07:41 阅读更多 →
NeurIPS、ICLR等页数查找

NeurIPS、ICLR等页数查找

毕业论文需要ICLR等论文页数查找页数NeurIPSICLR查找页数 有些论文找不到,openreview没有页数,记录一下 NeurIPS https://papers.nips.cc/ 直接搜索,得到bibtex格式,存在页数 ICLR 2017年:https://www.proceeding…

2026/5/17 11:07:40 阅读更多 →

最新新闻

Claude Code+GLM-4.7+VSCode:AI编程协作者的工程化落地实践

Claude Code+GLM-4.7+VSCode:AI编程协作者的工程化落地实践

1. 为什么这组组合正在悄悄取代 Cursor——一个一线开发者的实测观察最近三个月,我彻底停用了 Cursor,不是因为功能不好,而是它在真实项目节奏里开始“卡顿”:写一个中等复杂度的 Vue 组件要反复切换上下文,调试时 AI …

2026/7/7 8:20:14 阅读更多 →
Cloudreve安全加固实战:Nginx安全响应头配置详解与避坑指南

Cloudreve安全加固实战:Nginx安全响应头配置详解与避坑指南

1. 项目概述:为什么Cloudreve的安全加固刻不容缓?如果你正在公网环境运行Cloudreve,并且只是简单地用Nginx做了个反向代理,那你的文件服务可能正暴露在诸多安全风险之下。我见过太多案例,管理员只关心功能是否跑通&…

2026/7/7 8:18:14 阅读更多 →
上下文腐化:当大模型的长窗口变成“认知负担”

上下文腐化:当大模型的长窗口变成“认知负担”

上下文腐化:当大模型的长窗口变成“认知负担” 引言 从最初的4K、8K到如今的1M甚至10M,大模型的上下文窗口正在以惊人的速度膨胀。每一次窗口长度的刷新都被当作技术进步的标志来庆祝——仿佛更大的窗口就意味着更强的能力、更高的智能。 但一个残酷的…

2026/7/7 8:16:13 阅读更多 →
microG Services深度解析:实现无Google生态的Android应用兼容性

microG Services深度解析:实现无Google生态的Android应用兼容性

microG Services深度解析:实现无Google生态的Android应用兼容性 【免费下载链接】GmsCore Free implementation of Play Services 项目地址: https://gitcode.com/GitHub_Trending/gm/GmsCore microG Services是一个开源的Google Play Services替代框架&…

2026/7/7 8:16:13 阅读更多 →
终极指南:用microG实现无Google服务的Android应用兼容方案

终极指南:用microG实现无Google服务的Android应用兼容方案

终极指南:用microG实现无Google服务的Android应用兼容方案 【免费下载链接】GmsCore Free implementation of Play Services 项目地址: https://gitcode.com/GitHub_Trending/gm/GmsCore 在Android生态中摆脱Google服务依赖并运行YouTube等应用,m…

2026/7/7 8:14:10 阅读更多 →
2026新手第一套电子鼓怎么选?高性价比电子鼓横评推荐

2026新手第一套电子鼓怎么选?高性价比电子鼓横评推荐

很多新手来找我咨询买鼓,问的第一句往往是:“老师,罗兰和雅马哈哪个好?”——这个问题本身就问错了。买电子鼓和买手机不一样。手机看品牌看系统,但电子鼓的核心是手感、反馈和稳定性。品牌溢价再高,敲下去…

2026/7/7 8:12:09 阅读更多 →

日新闻

鸿蒙新特性:图片画廊与轮播导航——构建沉浸式图片浏览体验

鸿蒙新特性:图片画廊与轮播导航——构建沉浸式图片浏览体验

图片浏览是移动应用中最高频的场景之一。从社交应用的照片流到电商平台的商品图集,从旅游应用的景点相册到摄影作品展示——用户对图片浏览的体验要求不断提高:流畅的切换动画、直观的缩略图导航、便捷的收藏操作、自动播放模式。HarmonyOS NEXT ArkUI 虽…

2026/7/7 0:05:16 阅读更多 →
24V DC-DC降压芯片PW2312B/PW2815,SOT23-6到SOP8-EP方案对比

24V DC-DC降压芯片PW2312B/PW2815,SOT23-6到SOP8-EP方案对比

24V稳压芯片完整选型指南 PW8600 PW75XX PW2815 PW2312B LDODC/DC全方案 一、24V稳压方案概述 24V直流电源在工业自动化、门禁系统、电梯控制、汽车电子、LED驱动、监控设备等场景中应用极广,是最常见的中压直流母线电压。要将24V母线稳定降压至下游MCU、传感器…

2026/7/7 0:05:16 阅读更多 →
RAG+知识图谱混合检索与Graph RAG核心对比

RAG+知识图谱混合检索与Graph RAG核心对比

做企业RAG落地的团队,往往容易卡在一容易踩坑的选型难题: 当需求单纯靠向量RAG搞不定、单纯靠知识图谱也搞不定,必须同时依赖「文本语义理解 实体关系推理」时,到底是做「向量图谱混合检索」就够了,还是必须上「Grap…

2026/7/7 0:07:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/6 8:11:50 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/6 8:11:52 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/6 6:52:56 阅读更多 →

月新闻