binary-tree-preorder-traversal
题意:前序遍历二叉树
前序遍历 根->左子树->右子树
先递归解法:
class Solution { public: vector<int> preorderTraversal(TreeNode *root) { vector<int>res; position(root, res); return res; } void position(TreeNode *root, vector<int> &res){ if (root){ res.push_back(root->val); position(root->left, res); position(root->right, res); } } };
非递归方法:
在了解非递归之前,我们先了解一下递归在计算机中是怎样实现的。
递归,说白了就是将函数指针放入栈中!然后根据先进后出的原则进行递归!
其实非递归方法就是在模拟递归方法!想一下!如何将遍历到左子树之后又如何遍历到右子树呢?
而且,当遍历到左子树又向下遍历,遍历完最底层后发现需要遍历当前根的右子树,是不是需要记住父节点。那么你可以思考一下
递归的方法是不是相当于有了这样的一个思路来保存父节点!那依次类推,我们就用一个栈去保存父节点就好了。
特别值得注意的是,当你访问的顺序是 左子树->右子树;由于栈的先进后出的原则就变成了 右子树<-左子树!
class Solution { public: vector<int> preorderTraversal(TreeNode *root) { vector<int>res; stack<TreeNode *>s; if (root == NULL){ //空树 return res; } s.push(root); //放树根 while (!s.empty()){ TreeNode *cc = s.top(); s.pop(); res.push_back(cc->val); //访问根 if (cc->right != NULL){ s.push(cc->right); } if (cc->left != NULL){ s.push(cc->left); } } return res; } };
兄弟题!
实现后序遍历
递归法:略
非递归法:
class Solution { public: vector<int> postorderTraversal(TreeNode *root) { vector<int>res; stack<TreeNode *>ss; if (root == NULL)return res; ss.push(root); while (!ss.empty()){ TreeNode *cc = ss.top(); ss.pop(); res.push_back(cc->val); if (cc->left){ ss.push(cc->left); } if (cc->right){ ss.push(cc->right); } } reverse(res.begin(), res.end()); return res; } };
日语
作者:ALINGMAOMAO
出处:https://www.cnblogs.com/ALINGMAOMAO/p/9904688.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
分类:
数据结构
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探