• 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;
         }
         
     };

    日语

  • 相关阅读:
    vlc音视频开发(二)环境搭建(VS篇)
    vlc音视频开发(一)环境搭建(qt篇)
    Qt国际化
    Qt解析王者荣耀英雄JSON文件
    Qt使用spdlog日志
    windows核心编程之多进程多线程,线程的同步互斥
    第十八关——写在最后
    第十七关——搜索优化
    第十六关——动态规划
    第十五关——网络流
  • 原文地址:https://www.cnblogs.com/ALINGMAOMAO/p/9904688.html
Copyright © 2020-2023  润新知