zoukankan      html  css  js  c++  java
  • 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;
         }
         
     };

    日语

  • 相关阅读:
    MyBatis学习总结(八)——Mybatis3.x与Spring4.x整合
    MyBatis学习总结(五)——实现关联表查询
    MyBatis学习总结(六)——调用存储过程
    MyBatis学习总结(四)——解决字段名与实体类属性名不相同的冲突
    MyBatis学习总结(二)----使用MyBatis对表执行CRUD操作
    MyBatis学习总结(三)——优化MyBatis配置文件中的配置
    CORS跨域问题
    按指定后缀名删除文件的demo
    Markdown起步
    Linux和git起步
  • 原文地址:https://www.cnblogs.com/ALINGMAOMAO/p/9904688.html
Copyright © 2011-2022 走看看