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

日语

原文地址:https://www.cnblogs.com/ALINGMAOMAO/p/9904688.html