利用根在访问次序两端这一特性

class Solution {
public:
    vector<int> preorderTraversal(TreeNode* root) {
        vector<int> preOrder;
        if(root==nullptr) return preOrder;
        stack<TreeNode*> s;
        s.push(root);
        while(!s.empty()){
            TreeNode* u=s.top();s.pop();
            preOrder.push_back(u->val);
            if(u->right!=nullptr)
                s.push(u->right);
            if(u->left!=nullptr)
                s.push(u->left); 
        }
        return preOrder;
    }
};

通用做法

class Solution {
public:
    vector<int> preorderTraversal(TreeNode* root) {
        vector<int> preOrder;
        if(root==nullptr) return preOrder;
        stack<TreeNode*> s;
        TreeNode* u=root;
        while(!s.empty()||u!=nullptr){
            if(u!=nullptr){
                preOrder.push_back(u->val);
                s.push(u);
                u=u->left;
            }
            else{
                u=s.top();s.pop();
                u=u->right;
            }
        }
        return preOrder;
    }
};

中序遍历

通用做法

class Solution {
public:
    vector<int> inorderTraversal(TreeNode* root) {
        vector<int> inOrder;
        if(root==nullptr) return inOrder;
        stack<TreeNode*> s;
        TreeNode* u=root;
        while(!s.empty()||u!=nullptr){
            if(u!=nullptr){
                s.push(u);
                u=u->left;
            }
            else{
                u=s.top();s.pop();
                inOrder.push_back(u->val);
                u=u->right;
            }
        }
        return inOrder;
    }
};

后序遍历

通用做法:加入计数器

class Solution {
public:
    vector<int> postorderTraversal(TreeNode* root) {
        vector<int> postOrder;
        if(root==nullptr) return postOrder;
        stack<TreeNode*> s;
        map<TreeNode*,int> vis;
        TreeNode* u=root;
        while(!s.empty()||u!=nullptr){
            if(u!=nullptr){
                s.push(u);
                vis[u]=1;
                u=u->left;
            }
            else{
                u=s.top();
                if(vis[u]==1){
                    ++vis[u];
                    u=u->right;
                }
                else{
                    s.pop();
                    postOrder.push_back(u->val);
                    u=nullptr;
                }
            }
        }
        return postOrder;
    }
};

利用根在访问次序两端这一特性:双栈

class Solution {
public:
    vector<int> postorderTraversal(TreeNode* root) {
        vector<int> postOrder;
        if(root==nullptr) return postOrder;
        stack<TreeNode*> s1,s2;
        s1.push(root);
        while(!s1.empty()){
            TreeNode* u=s1.top();s1.pop();
            s2.push(u);
            if(u->left!=nullptr)
                s1.push(u->left); 
            if(u->right!=nullptr)
                s1.push(u->right);
        }
        while(!s2.empty()){
            TreeNode* u=s2.top();s2.pop();
            postOrder.push_back(u->val);
        }
        return postOrder;
    }
};

相关文章:

  • 2021-12-03
  • 2021-09-23
  • 2021-10-14
  • 2021-11-20
  • 2021-12-18
  • 2021-11-30
  • 2021-11-20
  • 2021-04-10
猜你喜欢
  • 2022-12-23
  • 2022-01-14
  • 2021-12-03
  • 2021-11-19
  • 2021-11-19
  • 2021-12-03
相关资源
相似解决方案