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 国际」许可协议进行许可。

posted @   青山新雨  阅读(170)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
more_horiz
keyboard_arrow_up light_mode palette
选择主题
点击右上角即可分享
微信分享提示